stack为ADT中的一种数据结构,该结构特点是先进后出,Stack继承了Vector,Vector继承了AbstractList类,由此可见Stack也是集合。他的实现方法一般有两种:

一种为单链表(node只有一个next指针的LinkedList),另一种是是数组。jdk中是以数组实现的。

1.栈的特点为先进后出。

栈中的一些常用方法:

pop()从栈中弹一个出来(即从栈顶删除一个元素,返回该元素),

peek()获取栈顶元素(不从栈顶删除),

push(E e)压入一个元素到栈顶(即从栈顶添加一个元素),

empty(判断栈是否为空),

search(Object o)从栈中搜索一个元素。

以上为Stack中的实现的所有方法。

2.栈的应用

如何计算表达式  a+b*c+(d*e+f)*g

1.要计算这个表达式,首先要知道后序表达式

通常我们用到的表达式为中序表达式,即运算符号在运算值的中间,就像a+b,  a+b*c+(d*e+f)*g,

但其实还有另一种表达式,叫后序表达式。该表达式是将运算符号放在运算值后来进行计算的,

如:a+b 写成 ab+,  a+b*c写成 abc*+,  a+b*c+d+e/f写成 abc*+def/++

中序表达式如何转换为后序表达式,例如String str = a+b*c+(d*e+f)*g  输出结果  abc*+de*f+g*+

1.首先有两个存储的对象,一个为后序表达式的结果值可变字符串sf,一个存储运算符号的stack

2.遍历字符串str,获取每一项的值item,如果是运算值(abc),添加到sf;

3.如果是运算符号:

1)如果是 */( 直接添加到stack

2)如果是 +- ,

如果stack栈顶的元素为+-或空的时候直接添加到stack,

如果为*/则弹出stack中的所有元素( 如果有(,则弹到( ),然后添加到sf中。然后将+-压入stack

3)如果是 ) , 弹出(之前的所有元素,然后添加到sf中

3.弹出stack中所有的元素,然后添加到sf中

下边是代码

1   private static Set diginal = new HashSet();//存放表达式中的运算符号

2

3 public static voidmain(String[] args) {4 String str = "a+b*c+(d*e+f)*g";5 Pattern p = Pattern.compile("[+*()-/]");6 Matcher m =p.matcher(str);7 while(m.find()) {8 String item =m.group();9 diginal.add(item);10 }11 }12

13 /**

14 * 中序表达式转后续表达式15 *16 *@paramstr17 *@return

18 */

19 public staticString transfer(String str) {20 boolean flag = false;//判断有没有(

21 StringBuffer sf = newStringBuffer();22 Stack stack = new Stack();23 for (int i = 0; i < str.length(); i++) {24 char item =str.charAt(i);25 if (!diginal.contains(item + "")) {26 sf.append(item);27 } else{28 if (item == '+' || item == '-') {29 if (!stack.isEmpty()30 && (stack.peek() == '*' || stack.peek() == '/')) {31 while (!stack.isEmpty()) {32 if (flag && stack.peek() == '(') {33 break;34 }35 sf.append(stack.pop());36 }37 stack.push(item);38 } else{39 stack.push(item);40 }41 } else if (item == ')') {42 while (stack.peek() != '(') {43 sf.append(stack.pop());44 }45 stack.pop();46 } else{47 if (item == '(') {48 flag = true;49 }50 stack.add(item);51 }52

53 }54 }55 while (!stack.isEmpty()) {56 sf.append(stack.pop());57 }58 returnsf.toString();59 }

2.通过后序表达式计算值(只给出结果形式的字符串,)

1.初始化两个变量, 结果字符串sf,存放运算值的stack

2.遍历后序表达式字符串str, 每一项为item

3.当item为运算值的时候, 添加到stack, 如果是+-*/,则从stack栈顶弹出两个元素, 然后进行运算, 然后将结果值压入到stack中。

下边是代码

1 /**

2 * 计算3 *4 *@return

5 */

6 public staticString cal(String str) {7 Stack stack = new Stack();8 StringBuffer sf = newStringBuffer();9 for (int i = 0, n = str.length(); i < n; i++) {10 char item =str.charAt(i);11 if (!(item == '+' || item == '-' || item == '*' || item == '/')) {12 stack.push(item + "");13 } else{14 String b =stack.pop();15 String a =stack.pop();16 sf.append(b).append(item).append(a);17 stack.push("(" + a + item + b + ")");//用括号括起来表明计算结果

18 }19 }20

21 returnstack.pop();22 }

java 栈 先进后出_java中的stack相关推荐

  1. java 栈 先进后出_java堆栈 先进后出是什么意思

    java堆栈 先进后出是什么意思 java堆栈中数据怎么存放 JVM(虚拟机)在启动后,会在内存较低位置建立一块区域,作为堆.并有默认的大校当不够时,自动向下延伸.会在内存较高位置建立一块区域,作为栈 ...

  2. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  3. java如何抛出异常_java中 方法中抛出异常处理方法

    展开全部 Java语言提供e69da5e887aa62616964757a686964616f31333366306461两种异常处理机制:捕获异常和声明抛弃异常. 1.捕获异常: (1)在Java程 ...

  4. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  5. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信

    你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...

  6. java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园

    1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...

  7. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

  8. java 代码锁_Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

  9. java wait 参数_java中wait()和join()方法的区别是什么

    java中wait()和join()方法的区别是:存在不同的java包中:wait()方法用于线程间通信,它所施加的等待状态的线程可以被启动:join()方法用于在多个线程之间添加排序,它所施加的等待 ...

最新文章

  1. 从Hadoop集群中移除一块磁盘的操作
  2. php获取form传递的变量,PHP-将变量传递给Ninja Form字段
  3. RedisDeskTopManager连接时提示:can't nonnect to redis-server
  4. [c#菜鸟]lambda表达式
  5. python设计模式免费_python 设计模式
  6. 西安圈子聚会心得分享
  7. java 分页原理_关于javaweb分页原理
  8. fuser命令使用说明
  9. 背景建模与前景检测之二(Background Generation And Foreground Detection Phase 2)
  10. 智慧路灯物联网解决方案
  11. java投票小程序_一个实现不记名投票的小程序
  12. python计算机二级考试大题总结
  13. cocos2d-x开源游戏引擎,C++开发iphone/android/uphone/win32游戏
  14. 【opencv学习之十二】opencv滑条及实例
  15. 【程序员必读】经验:编程的智慧
  16. PHP开发微信提现到银行卡
  17. el-input实现防抖
  18. 计算机在英语专业的应用论文,计算机英语双语应用分析论文
  19. python外文文献翻译_英文学术文献翻译软件有哪些推荐?
  20. javaee笔记(10)JSF

热门文章

  1. 信大捷安和诺瓦面试题
  2. JavaWeb 从入门到入门
  3. Eclipse中手动安装PyDev
  4. redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?
  5. openpose的多个版本,手部关键点检测,人体关键点检测
  6. 从事财务管理系统开发两年以来
  7. Unity - 搬砖日志 - BRP 管线下的自定义阴影尺寸(脱离ProjectSettings/Quality/ShadowResolution设置)
  8. 【日常学习】【搜索递推和其他】10.21.2015校内测试总结
  9. CCF认证考试——称检测点查询
  10. vue+js+element组件上传图片(el-upload)与图片展示