数据结构之(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}
输入正确

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

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

《数据结构》实验三:栈和队列实验

《数据结构》实验三:    栈和队列实验 一..实验目的      巩固栈和队列数据结构,学会运用栈和队列。 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操...
  • itsLIANGYINGYI_
  • itsLIANGYINGYI_
  • 2014年11月05日 22:54
  • 1728

《数据结构》实验三:栈和队列实验 (实验报告)

一.实验目的      巩固栈和队列数据结构,学会运用栈和队列。 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作。 2.学习运用栈和队列的知识来解决实际问...
  • denise94
  • denise94
  • 2014年11月05日 12:08
  • 4880

数据结构-栈和队列小结

1栈   1>栈的定义:       栈是限定仅在表尾进行插入和删除操作的线性表。       我们把插入和删除的一端称为栈顶(TOP),另一端称为栈底(BOTTOM),不包含任何元素的栈称为空...
  • XiangTianZaiJie500
  • XiangTianZaiJie500
  • 2016年10月24日 17:22
  • 1221

常见数据结构(一)-栈,队列,堆,哈希表

本文介绍几种常见的数据结构:栈、队列、堆、哈希表,等等。
  • h3243212
  • h3243212
  • 2016年10月14日 00:35
  • 3218

数据结构实验报告 栈和队列

一、实验目的1.掌握栈、队列的思想及其存储实现。 2.掌握栈、队列的常见算法的程序实现。二、实验仪器及环境:PC计算机 windows 7操作系统 CodeBlocks10.05三、实验内容...
  • wuxuanyi27
  • wuxuanyi27
  • 2016年04月26日 20:30
  • 1515

基础数据结构 链表、栈、队列

数据结构是程序设计中一个非常重要的部分,基本的数据结构包括链表、栈和队列,当然高级一点的还有树、图等,实际上链表、栈和队列都是线性表,只是在操作和表示方式上有所不同,线性表用顺序结构表示就是顺序表,用...
  • LucienDuan
  • LucienDuan
  • 2014年08月24日 19:15
  • 1282

数据结构学习总结(四)队列和栈

3.队列 队列其实可以看作是一种特别的线性表,一种对存储有特定要求的线性表。队列的特性就是FIFO——先进先出,就像平常的排队一样,先排队的先处理,队列中的进、出一般用PUSH、POP表示。队列是一种...
  • csdnligao
  • csdnligao
  • 2015年07月18日 20:45
  • 538

浅析数据结构与算法1--栈和队列

1. 基本概念 概念很简单,栈 (Stack)是一种后进先出(last in first off,LIFO)的数据结构,而队列(Queue)则是一种先进先出 (fisrt in first out,...
  • baidu_35561918
  • baidu_35561918
  • 2016年08月07日 16:47
  • 355

数据结构 用栈和队列判断回文数

12321,你是不是你,这样的东西叫回文,由于队列和栈的存储方式不同,栈是LIFO,last in first out ,盘子一个一个堆,堆完后从上面开始拿;队列是FIFO,first  in fir...
  • iaiti
  • iaiti
  • 2013年08月17日 13:18
  • 7864

数据结构实验四 栈和队列

一、实验目的 理解栈和队列的工作原理,掌握栈和队列在计算机程序设计中的应用。 二、实验内容 中缀表达式到后缀表达式的转换。 三、设计要求 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利...
  • PoorGuy_tn
  • PoorGuy_tn
  • 2017年11月10日 09:23
  • 132
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构之(3)栈和队列
举报原因:
原因补充:

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