此文章介绍关于顺序栈,链式栈的实例操作,括号匹配,表达式求值(后缀表达式)
1.声明一个栈接口SStack
package ch05; public interface SStack{ boolean isEmpty(); // 判断栈是否为空 void push(T x); // 元素x入栈 T pop(); // 出栈,返回栈顶元素 T peek(); // 返回栈顶元素,但不出栈 }
2. 定义顺序栈类SeqStack
package ch05; public class SeqStackimplements SStack { 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 =0){ str="("; for (int i=top;i>=0;i--){ str+=element[i]+","; } str=str.substring(0,str.length()-1); str+=")"; }else {//空栈 str="()"; } return str; } }
3.定义结点类Node
package ch05; public class Node{ public T data; public Node next; public Node(T data, Node next) { this.data = data; this.next = next; } public Node(){ this(null,null); } }
4. 定义链式栈类LinkedStack
package ch05; public class LinkedStackimplements SStack { private Node 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 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 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) { SeqStackstack = new SeqStack (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)); } }
6.表达式求值(后缀表达式):
package ch05; import java.util.Scanner; public class ExpressionPoland { // 括号匹配 public static String isMatched(String infix) { SeqStackstack = new SeqStack (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 stack=new SeqStack (infix.length()); StringBuffer postfix=new StringBuffer(infix.length()*2); int i=0; System.out.println("\n求后缀表达式过程:"); System.out.println("字符"+"\tstack\t\tpostfix"); while(i ='0' && ch<='9'){ // 获取运算的整数 postfix.append(ch); // 将数字追加到后缀表达式中 i++; if(i stack=new LinkedStack (); int value=0; System.out.println("\n计算过程:"); for(int i=0;i ='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数据结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!