//结点类
public class Node {Object element; //数据域Node next;  //指针域//头结点的构造方法public Node(Node nextval){this.next = nextval;}//非头结点的构造方法public Node(Object obj,Node nextval){this.element = obj;this.next = nextval;}//获得当前结点的后继结点public Node getNext(){return this.next;}//获得当前的数据域的值public Object getElement(){return this.element;}//设置当前结点的指针域public void setNext(Node nextval){this.next = nextval;}//设置当前结点的数据域public void setElement(Object obj){this.element = obj;}public String toString(){return this.element.toString();  }
}
//栈接口
public interface Stack {//入栈public void push(Object obj) throws Exception;//出栈public Object pop() throws Exception;//获得栈顶元素public Object getTop() throws Exception;//判断栈是否为空public boolean isEmpty();
}//顺序栈
public class SequenceStack implements Stack {Object[] stack; //对象数组final int defaultSize =10; //默认最大长度int top; //栈顶位置int maxSize; //最大长度public SequenceStack(){init(defaultSize);  }public SequenceStack(int size){init(size);}public void init(int size){this.maxSize = size;top =0;stack = new Object[size];}@Overridepublic Object getTop() throws Exception {// TODO Auto-generated method stubif(isEmpty()){throw new Exception("堆栈为空!");}return stack[top-1];}@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn top==0;}@Overridepublic Object pop() throws Exception {// TODO Auto-generated method stubif(isEmpty()){throw new Exception("堆栈为空!");}top--;return stack[top];}@Overridepublic void push(Object obj) throws Exception {// TODO Auto-generated method stub//首先判断栈是否已满if(top == maxSize){throw new Exception("堆栈已满!");}stack[top]=obj;top++;}}
//链表堆栈
public class LinkStack implements Stack {Node head;  //栈顶指针int size;  //结点的个数public LinkStack(){head = null;size = 0;}@Overridepublic Object getTop() throws Exception {// TODO Auto-generated method stubreturn head.getElement();}@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn head==null;}@Overridepublic Object pop() throws Exception {// TODO Auto-generated method stubif(isEmpty()){throw new Exception("栈为空!");}Object obj = head.getElement();head = head.getNext();size--;return obj;}@Overridepublic void push(Object obj) throws Exception {// TODO Auto-generated method stubhead = new Node(obj,head);size++;}}

以上是节点,顺序栈和链表栈;

下面分别是表达式括号的匹配使用和表达式计算;

public class Test {public static String[] expToStringArray(String exp){int n = exp.length();String[] arr = new String[n];for(int i=0;i<arr.length;i++){arr[i]= exp.substring(i, i+1);}return arr;}//判断表达式的括号是否正确public static void signCheck(String exp)throws Exception{SequenceStack stack = new SequenceStack();String[] arr = Test.expToStringArray(exp);for(int i=0;i<arr.length;i++){if(arr[i].equals("(")||arr[i].equals("[")||arr[i].equals("{")){stack.push(arr[i]);}else if(arr[i].equals(")")&& !stack.isEmpty()&& stack.getTop().equals("(")){stack.pop();}else if(arr[i].equals(")")&& !stack.isEmpty()&& !stack.getTop().equals("(")){System.out.println("左右括号匹配次序不正确!");return ;}else if(arr[i].equals("]")&& !stack.isEmpty()&& stack.getTop().equals("[")){stack.pop();}else if(arr[i].equals("]")&& !stack.isEmpty()&& !stack.getTop().equals("[")){System.out.println("左右括号匹配次序不正确!");return ;}else if(arr[i].equals("}")&& !stack.isEmpty()&& stack.getTop().equals("{")){stack.pop();}else if(arr[i].equals("}")&& !stack.isEmpty()&& !stack.getTop().equals("{")){System.out.println("左右括号匹配次序不正确!");return ;}else if(arr[i].equals(")")||arr[i].equals("]")||arr[i].equals("}")&& stack.isEmpty()){System.out.println("右括号多于左括号!");return ;}}if(!stack.isEmpty()){System.out.println("左括号多于右括号!");}else{System.out.println("括号匹配正确!");}}//计算后缀表达式,表达式一个一个根据规则入栈和出栈public static void expCaculate(LinkStack stack) throws Exception{char ch; //扫描每次输入的字符。int x1,x2,b=0; //x1,x2:两个操作数 ,b字符的ASCII码System.out.println("输入后缀表达式并以#符号结束:");while((ch =(char)(b=System.in.read()))!='#'){//如果是数字,说明是操作数则压入堆栈if(Character.isDigit(ch)){stack.push(new Integer(Character.toString(ch)));}//如果不是数字,说明是运算符else{x2 = ((Integer)stack.pop()).intValue();x1 = ((Integer)stack.pop()).intValue();switch(ch){case '+':x1+=x2;break;case '-':x1-=x2;break;case '*':x1*=x2;break;case '/':if(x2==0){throw new Exception("分母不能为零!");}else{x1/=x2;}break;}stack.push(new Integer(x1));}}System.out.println("后缀表达式计算结果是:"+stack.getTop());}/*** @param args*/public static void main(String[] args) throws Exception {// TODO Auto-generated method stub//SequenceStack stack = new SequenceStack(10);/*LinkStack stack = new LinkStack();Scanner in = new Scanner(System.in);int temp;for(int i=0;i<10;i++){System.out.println("请输入第"+(i+1)+"个整数:");temp = in.nextInt();stack.push(temp);}while(!stack.isEmpty()){System.out.println(stack.pop());}*///String str = "([(a+b)-(c*e)]+{a+b}";//Test.signCheck(str);//(2+3)*(3-1)/2=5   23+31-*2/LinkStack stack = new LinkStack();Test.expCaculate(stack);}}

转载于:https://blog.51cto.com/wukong0716/1687362

堆栈的使用(部分学习)相关推荐

  1. 堆栈——Windows核心编程学习手札之十八

    堆栈 --Windows核心编程学习手札之十八 堆栈可以用来分配许多较小的数据块,可以不考虑分配粒度和页面边界之类的问题,但分配和释放内存块的速度比其他机制要慢,并且无法直接控制物理存储器的提交和回收 ...

  2. 线程的堆栈——Windows核心编程学习手札之十六

    线程的堆栈 --Windows核心编程学习手札之十六 系统会在进程的地址空间内保存一些区域,同时也会在进程地址空间内为线程的堆栈保留区域.线程都有自己的堆栈,创建时,系统就保留一个堆栈空间区域,并将相 ...

  3. java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息

    Jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息. 这里需要注意的是 Java 8 引入了 Java Mission Control, ...

  4. 用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈

    用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈 深度学习已变得无处不在,不可或缺.这场革命的一部分是由可扩展的深度学习系统推动的,如滕索弗洛.MXNet.咖啡和皮托奇.大多数现有系统针对 ...

  5. 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程

    深度学习 免费课程 by David Venturi 大卫·文图里(David Venturi) 深入学习深度学习,提供15项免费在线课程 (Dive into Deep Learning with ...

  6. Nvidia推出强大的新图形芯片Tesl V100加速进军AI和深度学习的步伐

    Nvidia公司携旗下的图形处理器在半导体领域可以说是声名赫赫,Nvidia图形处理器曾为创造最热门的游戏个人电脑立下汗马功劳,而时至今日原来的游戏市场几乎成了后娘的儿子. Nvidia日前在加利福尼 ...

  7. 深度学习蚕食软件,十年内大部分软件工作不再涉及编程

    原作 Pete Warden  夏乙 编译自 Pete Warden's blog 量子位 出品 | 公众号 QbitAI △ Pete Warden 周末,特斯拉AI负责人Andrej Karpat ...

  8. 初识深度学习(将各方所写融合)

    深度学习(Deep Learning,简称DL)的定义 深度学习是用于建立.模拟人脑进行分析学习的神经网络,并模仿人脑的机制来解释数据的一种复杂的机器学习算法,对学习过程中获得的信息对诸如文字.图像和 ...

  9. Spring boot 缓存学习笔记

    Spring boot 缓存 1. spring cache spring cache 是spring 3.1 引入的新技术, 核心思想:调用一个缓存方法时会把该方法参数和返回结果,作为一个键值存入缓 ...

  10. 集成学习(Ensemble Learning),Bagging、Boosting、Stacking

    1 集成学习概述 1.1 概述 在一些数据挖掘竞赛中,后期我们需要对多个模型进行融合以提高效果时,常常会用Bagging,Boosting,Stacking等这几个框架算法,他们不是一种算法,而是一种 ...

最新文章

  1. Room是怎样和LiveData结合使用的?(源码分析)
  2. 使用 XPath 2.0 和 XSLT 2.0 节省开发时间并减少代码量
  3. Qt for QNX
  4. 不做CIO 就做首席架构师
  5. 快速地创建快顶尖的医学图像处理控件ImageGear Medical
  6. Java Arrays类进行数组排序需要注意的事情
  7. 李航《统计学习方法》第二章课后答案链接
  8. Ubuntu安装minicom串口工具
  9. (转载)突然就看懂了《大话西游》
  10. 用代码理解ObjC中的发送消息和消息转发
  11. 慕课python七月_【慕课有约】七月老师:关于小程序的那些事
  12. jquery字符串转json
  13. (对拍配套)随机生成数据
  14. 西南大学奥鹏教育计算机基础答案,西南大学网络与继续教育学院课程 1055《powerpoin…...
  15. 如何快速掌握一门新技术
  16. STM32使用MDK keil 调试问题汇总
  17. mysql 错误 #2054 解决方案
  18. linux下usb充电问题,如何解决在Ubuntu上iPad不能充电的问题
  19. JavaSwing_4.1: JFrame(窗口)
  20. Javascript 实现城市选择控件

热门文章

  1. 软件测试工程师的核心竞争力是什么
  2. speak 计算机英语作文,跪求一篇英语作文 题目:论计算机的优缺点
  3. 兼容性测试需要注意的测试点
  4. 不宜使用Selenium自动化的10个测试场景
  5. 一车abs线路怎么量_神木沥青拌合站烧火油怎么购买更划算
  6. mysql的时间在cmd的输入格式_获取“System.FormatException:输入字符串的格式不正确。”在日期时间对象插入到MySql数据库...
  7. 计算机维修和维护实训报告,计算机维护与维修实训报告书.docx
  8. 游戏与计算机系统不兼容,电脑安装游戏时提示此文件版本与正在运行Windows不兼容的解决方法...
  9. 动态展开所有_动态演示立方体的展开,并且显示11种展开图——GeoGebra制作教程...
  10. 【matlab】三维曲面(矩形网格---meshgrid)