iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java数据结构中栈怎么应用
  • 722
分享到

java数据结构中栈怎么应用

2023-06-22 04:06:40 722人浏览 独家记忆
摘要

本篇内容主要讲解“java数据结构中栈怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java数据结构中栈怎么应用”吧!声明一个栈接口SStackpackage ch05;&nb

本篇内容主要讲解“java数据结构中栈怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java数据结构中栈怎么应用”吧!

声明一个栈接口SStack

package ch05; public interface SStack <T>{    boolean isEmpty();  // 判断栈是否为空    void push(T x);// 元素x入栈    T pop();// 出栈,返回栈顶元素    T peek();// 返回栈顶元素,但不出栈}

 2. 定义顺序栈类SeqStack<T>,包括数据元素的对象数组和栈顶元素下标两个私有成员变量,构造方法可实例化容量为size大小的空顺序栈,调用类中成员方法实现顺序栈的入栈、出栈、获取栈顶元素等操作,重写toString()方法获取顺序栈的字符串描述。

package ch05; public class SeqStack <T> implements SStack<T>{    Object[] element;    int top;    // 构造方法,创建一个空栈,存储容量大小size    public SeqStack(int size){        element=new Object[size];        top=-1;    }    // 判断栈是否为空    @Override    public boolean isEmpty() {        return top==-1;    }     // 元素x入栈    @Override    public void push(T x) {        if (x==null){            return;        }        // 若栈满,则扩充栈容量        if (this.top==element.length-1){            Object[] temp=this.element;            element=new Object[temp.length*2];            for (int i=0;i<temp.length;i++){                element[i]=temp[i];            }        }        //入栈        this.element[++top]=x;    }     // 出栈,返回栈顶元素    @Override    public T pop() {        if (top!=-1){            return (T) this.element[this.top--];        }        return null;    }    // 返回栈顶元素,但不出栈    @Override    public T peek() {        if (top!=-1){            return (T) this.element[this.top];        }        return null;    }    // 返回顺序栈中所有元素的描述字符串,形式为"(,)",覆盖Object类的toString()方法    public String toString(){// 自栈顶输出到栈底        String str="";        if (top>=0){            str="(";            for (int i=top;i>=0;i--){                str+=element[i]+",";            }            str=str.substring(0,str.length()-1);            str+=")";        }else {//空栈            str="()";        }        return str;    }}

定义结点类node<T>,包括数据域和地址域两个成员变量,构造方法实例化结点,重写toString()方法获取结点的字符串描述。

package ch05; public class Node <T>{    public T data;    public Node<T> next;     public Node(T data, Node<T> next) {        this.data = data;        this.next = next;    }    public Node(){        this(null,null);    }}

  定义链式栈类LinkedStack<T>:

package ch05; public class LinkedStack<T> implements SStack<T>{    private Node<T> top;     public LinkedStack() {        top=new Node<>();    }     @Override    public boolean isEmpty() {        return top.next==null ? true:false;    }     @Override    public void push(T x) {        if (x==null){            return;        }        //生成新结点        Node<T> q=new Node<>(x,null);        q.next=top.next;        top.next=q;    }     @Override    public T pop() {        T elem=null;        if (top.next!=null){            elem=top.next.data;            top.next=top.next.next;        }        return elem;    }     @Override    public T peek() {        T elem=null;        if (top.next!=null){            elem=top.next.data;        }        return elem;    }    // 返回顺序栈中所有元素的描述字符串,形式为"(,)",覆盖Object类的toString()方法    public String toString(){        String str="";        Node<T> p=top.next;        if (p!=null){            str="(";            while (p!=null){                str+=p.data+",";                p=p.next;            }            str=str.substring(0,str.length()-1);            str+=")";        }else {            str="()";        }        return str;    }}

 5.括号匹配

package ch07; import java.util.Scanner; public class Bracket {// 括号匹配public static String isMatched(String infix) {SeqStack<Character> stack = new SeqStack<Character>(infix.length());for (int i = 0; i < infix.length(); i++) {char ch = infix.charAt(i);switch (ch) {case '(':stack.push(ch);break;case ')':if (stack.isEmpty() || !stack.pop().equals('(')) {return "expect (";}}}return stack.isEmpty() ? "" : "expect )";} // 测试括号匹配算法public static void main(String[] args) {// 括号匹配Scanner r = new Scanner(System.in);System.out.print("输入括号表达式:");String infix = r.nextLine();System.out.println(isMatched(infix));}}

表达式求值(后缀表达式):

package ch05; import java.util.Scanner; public class ExpressionPoland {    // 括号匹配    public static String isMatched(String infix) {        SeqStack<Character> stack = new SeqStack<Character>(infix.length());        for (int i = 0; i < infix.length(); i++) {            char ch = infix.charAt(i);            switch (ch) {                case '(':                    stack.push(ch);                    break;                case ')':                    if (stack.isEmpty() || !stack.pop().equals('(')) {                        return "expect (";                    }            }        }        return stack.isEmpty() ? "" : "expect )";    }    // 将中缀表达式转换为后缀表达式    public static StringBuffer toPostfix(String infix){        SeqStack<Character> stack=new SeqStack<Character>(infix.length());        StringBuffer postfix=new StringBuffer(infix.length()*2);        int i=0;        System.out.println("\n求后缀表达式过程:");        System.out.println("字符"+"\tstack\t\tpostfix");        while(i<infix.length()){ // 对表达式中的每个字符进行处理            char ch=infix.charAt(i); // 第i个字符            System.out.print(ch+"\t"); // 输出第i个字符            switch(ch){ // 判断字符类别                // +、-运算符                case '+':                case '-':                    // 当栈不空且栈顶运算符优先级高时,包括+、-、*、/                    while(!stack.isEmpty() && !stack.peek().equals('(')){ // 栈中的'('优先级最低                        postfix.append(stack.pop()+" ");  // 将出栈的运算符追加到后缀表达式中(空格间隔)                    }                    stack.push(ch); // 第i个字符入栈                    i++;                    break;                case '*':                case '/':                    // 当栈不空且栈顶运算符优先级高时,包括*、/                    while(!stack.isEmpty() && (stack.peek().equals('*') || stack.peek().equals('/'))){                        postfix.append(stack.pop()+" "); // 将出栈的运算符追加到后缀表达式中(空格间隔)                    }                    stack.push(ch); // 第i个字符入栈                    i++;                    break;                case '(':                    stack.push(ch); // '('入栈                    i++;                    break;                case ')':                    Character out=stack.pop();                    while(out!=null && !out.equals('(')){ // 若干运算符出栈,直到'('出栈                        postfix.append(out+" ");  // 将出栈的运算符追加到后缀表达式中(空格间隔)                        out=stack.pop();                    }                    i++;                    break;                default:                    while(i<infix.length() && ch>='0' && ch<='9'){ // 获取运算的整数                        postfix.append(ch); // 将数字追加到后缀表达式中                        i++;                        if(i<infix.length()){                            ch=infix.charAt(i); // 下一位字符                        }                    }                    postfix.append(" ");  // 运算数以空格间隔            }            System.out.printf("%-18s",stack.toString()); // 输出每个运算符或运算数处理后栈中的内容            System.out.println(postfix);  // 输出每个运算符或运算数处理后的后缀表达式        }        while(!stack.isEmpty()){ // 栈中运算符全部出栈            postfix.append(stack.pop());        }        return postfix;    }     // 计算后缀表达式的值    public static int toValue(StringBuffer postfix){        LinkedStack<Integer> stack=new LinkedStack<Integer>();        int value=0;        System.out.println("\n计算过程:");        for(int i=0;i<postfix.length();i++){            char ch=postfix.charAt(i);            if(ch>='0' && ch<='9'){                String s="";                while(ch!=' '){// 求运算数                    s+=ch;                    i++;                    ch=postfix.charAt(i);                }                stack.push(Integer.parseInt(s)); // 将运算数入栈            }else{                if(ch!=' '){                    int y=stack.pop(); // 第二个运算数                    int x=stack.pop(); // 第一个运算数                    switch(ch){                        case '+':                            value=x+y;                            break;                        case '-':                            value=x-y;                            break;                        case '*':                            value=x*y;                            break;                        case '/':                            value=x/y;                            break;                    }//switch                    // 输出计算表达式                    if(y>=0){                        System.out.println(x+(ch+"")+y+"="+value);                    }else{                        System.out.println(x+(ch+"")+"("+y+")"+"="+value);                    }                    // 计算结果入栈                    stack.push(value);                }            }        }        return stack.pop(); // 返回栈中计算的最终结果    }     // 测试表达式求值算法    public static void main(String[] args) {        Scanner r=new Scanner(System.in);        // 表达式求值        System.out.print("输入表达式:");        String infix = r.nextLine();        String match=isMatched(infix);        if(match.equals("")){// 括号匹配            StringBuffer postfix=toPostfix(infix);            System.out.println("\n后缀表达式:"+postfix);            System.out.println("\n计算结果:"+toValue(postfix));        }else{// 括号不匹配            System.out.println("表达式错误:"+match);        }    }}

运行结果如下:

java数据结构中栈怎么应用

到此,相信大家对“java数据结构中栈怎么应用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: java数据结构中栈怎么应用

本文链接: https://www.lsjlt.com/news/302482.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java数据结构中栈怎么应用
    本篇内容主要讲解“java数据结构中栈怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java数据结构中栈怎么应用”吧!声明一个栈接口SStackpackage ch05;&nb...
    99+
    2023-06-22
  • Java数据结构01——栈
    一、栈         1、栈的性质                 栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行...
    99+
    2023-09-20
    数据结构 java 开发语言
  • java数据结构关于栈的实例应用
    此文章介绍关于顺序栈,链式栈的实例操作,括号匹配,表达式求值(后缀表达式) 1.声明一个栈接口SStack package ch05; public interface SS...
    99+
    2022-11-12
  • java数据结构基础:栈
    目录准备工作编码环节push方法pop方法empty方法全部代码总结准备工作 工具:idea+jdk8 技术要求:java基础语法 编码环节 首先,我们得先确定下来,用什么数据来模拟...
    99+
    2022-11-12
  • 【数据结构】Java实现栈
    目录 1. 概念 2. 栈的使用  3. 自己动手实现栈(使用动态数组实现栈)  1. 创建一个MyStack类 2. push入栈 3. pop出栈 4. 查看栈顶元素 5. 判断栈是否为空与获取栈长 6. toString方法 4. 整...
    99+
    2023-10-27
    数据结构 jvm java
  • 疯狂数据结构-栈-Java
    概念 基本概念解读 当谈到 "栈" 时,它是一种遵循后进先出(Last In, First Out,LIFO)原则的有序集合。这意味着最后入栈的元素首先被弹出,而最早入栈的元素最后被弹出。在栈中,只能对最上面的元素进行操作,其他元素都不可见...
    99+
    2023-08-16
    数据结构 java 开发语言
  • 怎么分析Java数据结构中的栈与队列
    今天就跟大家聊聊有关怎么分析Java数据结构中的栈与队列,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一,栈1,概念在我们软件应用 ,栈这种后进先出数据结构的应用是非常普遍的。比如你...
    99+
    2023-06-29
  • Java数据结构中的堆怎么应用
    本篇内容介绍了“Java数据结构中的堆怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、堆的创建1、向下调整(以小堆为例) &nbs...
    99+
    2023-06-29
  • Java数据结构之栈的线性结构详解
    目录一:栈二:栈的实现三:栈的测试四:栈的应用(回文序列的判断)总结一:栈 栈是限制插入和删除只能在一个位置上进行的表,此位置就是表的末端,叫作栈顶。 栈的基本操作分为push(入...
    99+
    2022-11-12
  • java数据结构之栈的详解
    目录一、栈1.栈的应用1.1括号匹配1.2后缀表达式1.3用栈实现队列1.4最小栈1.5栈的压入和弹出序列总结一、栈 栈的特性就是先进后出,常用方法是入栈(push()),出栈(po...
    99+
    2022-11-12
  • java 数据结构之栈与队列
    java 数据结构之栈与队列一:对列队列是一种先进先出的数据结构实现代码:package Queue; public class Queue { //队列类 private int maxSize; //定义队列的长度 ...
    99+
    2023-05-31
    java 队列
  • Python数据结构与算法中的栈怎么构建
    本篇内容主要讲解“Python数据结构与算法中的栈怎么构建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python数据结构与算法中的栈怎么构建”吧!什么是栈栈有时也被称作“下推栈”。它是有序集...
    99+
    2023-06-29
  • Java数据结构学习之栈和队列
    目录一、栈1.1 概述1.1.1 线性表的概念1.1.2 栈的概念1.1.3 栈的应用二、队列2.1 队列的概念2.2 队列的实现2.3 队列的应用一、栈 1.1 概述 Java为什...
    99+
    2022-11-12
  • Java语言如何实现数据结构栈
    这篇文章主要介绍了Java语言如何实现数据结构栈,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先了解下栈的概念:栈是限定仅在表头进行插入和删除操作的线性表。有时又叫LIFO...
    99+
    2023-05-30
    java
  • java数据结构中的循环链表和栈是什么
    这篇文章主要讲解了“java数据结构中的循环链表和栈是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java数据结构中的循环链表和栈是什么”吧!目录循环链表:实现思路:代码实现:栈:实现...
    99+
    2023-06-20
  • 用Python实现数据结构之栈
    栈是最简单的数据结构,也是最重要的数据结构。它的原则就是后进先出(LIFO),栈被使用于非常多的地方,例如浏览器中的后退按钮,文本编辑器中的撤销机制,接下来我们用Python来具体实现这个数据结构。 栈中的方法 作为一个栈(用S来表示...
    99+
    2023-01-30
    数据结构 Python
  • C语言数据结构中的栈该怎么理解
    这期内容当中小编将会给大家带来有关C语言数据结构中的栈该怎么理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。栈的链式实现主要内容(1) 栈包含7个元素,依次是67,3,88,6,1,7,0,采用尾插入法...
    99+
    2023-06-22
  • Python数据结构与算法中的栈怎么实现
    这篇文章主要介绍“Python数据结构与算法中的栈怎么实现”,在日常操作中,相信很多人在Python数据结构与算法中的栈怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python数据结构与算法中的栈怎...
    99+
    2023-06-29
  • 如何在java数据结构中实现栈和队列
    这期内容当中小编将会给大家带来有关如何在java数据结构中实现栈和队列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。java 数据结构中栈和队列的实例详解栈和队列是两种重要的线性数据结构,都是在一个特定的...
    99+
    2023-05-31
    java ava
  • java数据结构基础:循环链表和栈
    目录循环链表:实现思路:代码实现:栈:实现思路:代码实现:总结循环链表: 与单链表的最后一个节点的指针域为null不同,循环链表的最后一个节点的指针指向头结点 实现思路: 初始化时将...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作