数据结构之(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
原创粉丝点击