数据结构之(3)栈和队列

原创 2015年11月18日 17:21:23

定义

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=9
stackXisEmpty=false
stackXisEmpty=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}
输入正确

理解:
此例,展示了,栈在代码语法检查中的应用。可以看到的是,栈,每次,只暴漏给我们一个元素,适当的运用栈来编写算法,会解决很多问题。思考下,如果,现在你不知道栈,这种数据结构工具,上面的这个检查语法案例,直接不从下手,只能是想到了,正则表达式,根据匹配,将所有的分隔符,从字符串中剔除,结果字符串没有,分隔符,则语法正确,但,仔细想来,其中还是有栈的思想在里面;

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

3-4-迷宫寻路-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

严蔚敏吴伟民版《数据结构》课本源码第3章栈和队列第4节迷宫寻路算法。

C语言数据结构之栈与队列的应用(3)

循环队列的应用——舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别...

数据结构学习-栈和队列(3)

问题描述:求解皇后问题:在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。 要求:(1)皇后的个数n由用户输入,其值不能超过20,输出所有的解。           ...
  • shope9
  • shope9
  • 2016年04月04日 18:43
  • 317

栈和队列3|进制转换 – 数据结构和算法25

栈和队列3:进制转换   让编程改变世界 Change the world by program   从二进制到八进制   地球人都知道,我们学习编程常常会接触到不同进制的数,而最多的...

3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

严蔚敏吴伟民版《数据结构》课本源码第3章栈和队列第6节汉诺塔问题。

高级算法日记3:python数据结构之栈和队列

废话 1 list 2 strings 栈 1 栈的数据结构 2 栈的应用 21括号顺序检测 22 前中后缀表达式 3 求解迷宫问题栈方法 队列 1 队列的数据结构...

3-5-表达式求值-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

严蔚敏吴伟民版《数据结构》课本源码第3章栈和队列第5节表达式求值。

数据结构3:队列与栈专题

数据结构专题3:队列与栈 循环队列实现类 队列实现类 栈实现类

数据结构--Chapte3(栈和队列)

3  栈和队列     在各类数据结构中,栈(Stack)和队列(Queue)是除线性表以外,另外两种应用非常广泛且极为重要的线性结构。它们与线性表不同之处在于:栈和队列都可被看成是两种操作受限的特殊...

3-2-进制转换-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

严蔚敏吴伟民版《数据结构》课本源码第3章栈和队列第2节进制转换。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构之(3)栈和队列
举报原因:
原因补充:

(最多只允许输入30个字)