数据结构之(3)栈和队列
来源:互联网 发布:linux如何创建账户 编辑:程序博客网 时间:2024/06/05 20:06
定义
1. 栈的定义
是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底。向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其下面的相邻元素成为新的栈顶元素。
在日常生活中,有许多类似栈的例子,如刷洗盘子时,依次把每个洗净的盘子放到洗好的盘子上,相当于进栈;取用盘子时,从一摞盘子上一个接一个地向下拿,相当于出栈。又如向枪支弹夹里装子弹时,子弹被一个接一个地压入,则为进栈;射击时子弹总是从顶部一个接一个地被射出,此为子弹出栈。
理解:1.栈的访问时受限的,只能方位到站定的元素2.栈是一种抽象的数据结构,可以通过链表数组等实现
2.栈的代码实现
a.栈的实现
public class StackX { private int maxCount; private int [] arr; private int top; //新建栈操作 public StackX(int size) { maxCount=size; arr=new int[maxCount]; top=-1; } //入栈操作 public void pushToStackX(int data) { if(top>maxCount-1){ new Exception(new Throwable("stack over full")).printStackTrace() ; }else{ arr[++top]=data; } } //出栈操作 public int popFromStackX(){ int topdata=0; if(top>maxCount-1){ new Exception(new Throwable("stack over full")).printStackTrace() ; }else{ topdata=arr[top]; --top; } return topdata; } //查看栈操作 public int peepStackX(){ if(!stackXisEmpty()){ return arr[top]; }else{ new Throwable("stack is empty").printStackTrace() ; return 0; } } //检查栈是否为空 public boolean stackXisEmpty(){ return top==-1?true:false; } //检查栈是否满 public boolean stackXisFull(){ return top==maxCount-1?true:false; }}
b.测试栈的各项操作:
public static void main(String[] args) { StackX stackX = new StackX(10); for (int i = 0; i < 10; i++) { stackX.pushToStackX(i); } System.out.println("stackXtop=" + stackX.peepStackX()); System.out.println("stackXisEmpty=" + stackX.stackXisEmpty()); for (int i = 0; i < 10; i++) { stackX.popFromStackX(); } System.out.print("stackXisEmpty="+stackX.stackXisEmpty()); }
结果显示:
stackXtop=9stackXisEmpty=falsestackXisEmpty=true
注意:
1.栈操作中的问题,栈溢出,因此在栈的实现过程中,需要向用户抛出栈溢出****Exception;
栈的使用
a.应用实例:
在控制台,输入一下字符串,检查其中分隔符是否匹配
b.编写代码:
//输入字符串 public static void getStringFromConsole(){ BufferedReader strin=new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入一个字符串:"+"\n"); try { String str = strin.readLine(); System.out.println("resultString="+str); if(!checkStringSparatoIsill(str)){ System.out.println("请检查语法错误"); }else{ System.out.println("输入正确"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //检查字符串是否合法 public static boolean checkStringSparatoIsill(String str){ boolean result=false; if(null!=str&&!"".equals(str)){ String strTrimed=str.trim(); StackX stackX=new StackX(strTrimed.length()); for(int i=0;i<strTrimed.length();i++){if(strTrimed.charAt(i)==CodeSeparator.CodeSeparator_1){ stackX.pushToStackX(CodeSeparator.CodeSeparator_1); } if(strTrimed.charAt(i)==CodeSeparator.CodeSeparator_3){ stackX.pushToStackX(CodeSeparator.CodeSeparator_3); } if(strTrimed.charAt(i)==CodeSeparator.CodeSeparator_5){ stackX.pushToStackX(CodeSeparator.CodeSeparator_5); } if(strTrimed.charAt(i)==CodeSeparator.CodeSeparator_2){ stackX.popFromStackX(); } if(strTrimed.charAt(i)==CodeSeparator.CodeSeparator_4){ stackX.popFromStackX(); } if(strTrimed.charAt(i)==CodeSeparator.CodeSeparator_6){ stackX.popFromStackX(); } } result=stackX.stackXisEmpty(); }else{ result=false; } return result; }
CodeSeparator
public interface CodeSeparator { public static char CodeSeparator_1='('; public static char CodeSeparator_2=')'; public static char CodeSeparator_3='['; public static char CodeSeparator_4=']'; public static char CodeSeparator_5='{'; public static char CodeSeparator_6='}'; }
调用:
public static void main(String[] args) { getStringFromConsole(); }
测试结果:
1请输入一个字符串:{{resultString={{请检查语法错误2请输入一个字符串:{}()[]resultString={}()[]输入正确3请输入一个字符串:a{b(c[d]e)f}resultString=a{b(c[d]e)f}输入正确
理解:
此例,展示了,栈在代码语法检查中的应用。可以看到的是,栈,每次,只暴漏给我们一个元素,适当的运用栈来编写算法,会解决很多问题。思考下,如果,现在你不知道栈,这种数据结构工具,上面的这个检查语法案例,直接不从下手,只能是想到了,正则表达式,根据匹配,将所有的分隔符,从字符串中剔除,结果字符串没有,分隔符,则语法正确,但,仔细想来,其中还是有栈的思想在里面;
0 0
- 数据结构之(3)栈和队列
- 数据结构之栈和队列(三)
- 数据结构之栈和队列(四)
- 数据结构(2)之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- 数据结构之栈和队列
- TextView性能优化
- 什么是智能机
- mysql 使用 记录
- Executors
- Apache Camel配置SSL的CXF
- 数据结构之(3)栈和队列
- java中用枚举类实现单例模式
- ArcGIS JS 版军事标绘图(燕尾箭头、钳击箭头、集结地)扇形等自定义图形
- coderforce 525B. Pasha and String
- mysql启动的四种方式
- POJ 3009 用DFS搜最短路径 适合用来学习DFS
- php-fpm的配置和优化
- 【FOJ2205 11月月赛A】【二分图结论题】据说题目很水 n个点上不形成三元环的最大边数
- [Android] EditText 的 inputType属性