关闭

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

标签: 数据结构
277人阅读 评论(0) 收藏 举报
分类:

定义

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}
输入正确

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27080次
    • 积分:466
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:1篇
    • 译文:1篇
    • 评论:10条
    最新评论