栈的学习-四则运算实例
来源:互联网 发布:经传软件吧 编辑:程序博客网 时间:2024/06/05 11:52
栈和队列
栈和队列是两种特殊的线性表,特殊之处在于插入与删除操作的位置受到限制,若插入和删除只能在线性表的一端进行,则为栈,特点是后进先出(LIFO);若插入和删除操作分别在线性表的两端进行,则为队列,特点是先进先出(FIFO)。
栈按不同的存储结构又分为顺序栈和链式栈,使用的时候可根据具体情况选择。当有频繁的插入删除操作是选取链式存取结构较好。
java中使用栈
1、Stack类
Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。 首次创建堆栈时,它不包含项。Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类
2、Deque接口
一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。
在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque 方法,如下表所示:
Deque实现的子类有ArrayDeque,LinkedList,LinkedBlockingDeque。
- ArrayDeque类
Deque接口的大小可变数组的实现。数组双端队列没有容量限制;它们可根据需要增加以支持使用。它们不是线程安全的;在没有外部同步时,它们不支持多个线程的并发访问。禁止 null 元素。此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList。 - LinkedList类
此类实现 Deque接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
栈的应用-四则运算
问题:对于一个算术表达式,如1+2*(3-4)+5,假定该表达式以通过编译系统的语法检查,怎么求解该表达式的值。
解题思路:先将中缀表达式转化为后缀表达式,然后对后缀表达式进行求解。
中缀表达式:即如题所示的表达式,运算符写在两个操作数的中间,由于运算符具有不同的优先级,圆括号会改变运算的次序,使得运算起来比较复杂。
后缀表达式:将运算符卸载两个操作数之后的表达式。可以严格按顺序计算,方便运算。如题的表达式转化为后缀表达式为,1 2 3 4 - * + 5 +
实现:
//将中缀表达式转为后缀表达式 1+2*(3-4)+5 public static String toPostfix(String expstr){ Deque<String> deque=new ArrayDeque<String>(expstr.length()); //创建运算符栈 String postfix="";//后缀表达式 int i=0; while(i<expstr.length()){ char ch=expstr.charAt(i); switch(ch){ case '+': case '-': while(!deque.isEmpty() && !deque.getFirst().equals("(")){ postfix+=deque.removeFirst(); } deque.addFirst(ch+""); i++; break; case '*': case '/': while(!deque.isEmpty() && (deque.getFirst().equals("*") || deque.getFirst().equals("/"))){ postfix+=deque.removeFirst(); } deque.addFirst(ch+""); i++; break; case '(': deque.addFirst(ch+""); i++; break; case ')': String out=deque.removeFirst(); while(out!=null && !out.equals("(")){ postfix+=out; out=deque.removeFirst(); } i++;break; default: while(i<expstr.length() && ch>='0' && ch<='9'){ postfix+=ch; i++; if(i<expstr.length()) ch=expstr.charAt(i); } postfix+=" "; } } while(!deque.isEmpty()){ postfix+=deque.removeFirst(); } return postfix; }
//后缀表达式:1 2 3 4 -*+5 + 计算后缀表达式的值 public static int countValue(String postfix){ Deque<Integer> deque=new LinkedList<Integer>(); //创建操作数栈 int i=0,result=0; while(i<postfix.length()){ char ch=postfix.charAt(i); if(ch>='0' && ch<='9'){ result=0; while(ch!=' '){ result=result*10+Integer.parseInt(ch+""); i++; ch=postfix.charAt(i); } i++; deque.addFirst(new Integer(result)); }else{ int y=deque.removeFirst(); int x=deque.removeFirst(); switch(ch){ case '+':result=x+y;break; case '-':result=x-y;break; case '*':result=x*y;break; case '/':result=x/y;break; } deque.addFirst(new Integer(result)); i++; } } return deque.removeFirst().intValue(); }
- 栈的学习-四则运算实例
- 09_栈的实例2---算术表达式(四则运算)
- 栈的四则运算
- 栈结构的四则运算
- 栈的运用---四则运算
- java 四则运算 栈的实现
- java 四则运算 栈的实现
- 栈的应用--简单四则运算
- 栈 实现四则运算的计算器
- 栈的应用--四则运算 c++
- java 四则运算 栈的实现
- 栈的应用-四则运算求值
- 栈的应用-四则运算表达式的求值
- 四则运算表达式求值(栈的应用)
- 栈和二叉树的使用--四则运算
- 华为机试题-四则运算-栈的利用
- 利用栈实现字符串的四则运算
- 四则运算表达式求值(栈的应用)
- 【设计模式】一些通用的面向对象设计原则简介
- CF414B、CF415DMashmokh and ACM【二维DP】
- UI 手势
- MediaPlayer的使用
- 控件阴影效果
- 栈的学习-四则运算实例
- 常用内部排序算法之二:快速排序
- Java相似知识点区别
- 深入理解linux i节点(inode)
- 优秀不够,必须卓越,做一个不可替代的手艺人
- ubuntu下安装交叉编译工具链
- db2数据库错误代码DB2 sqlcode=-766 sqlstate 57016 原因码 "7"错误
- Servlet开发
- WebKit(WKUIDelegate)