大话数据结构----栈

栈的定义:

栈(stack)是限定尽在表尾进行插入和删除操作的线性表。

从定义中可以看出,栈也是线性表,是一个特殊的线性表,之前说线性的表的时候,线性表可以在任意位置进行插入插入,而栈比线性表特殊的地方的就是不能随意的插入和删除了,栈的插入和删除只能在规定的同一端进行,而被允许插入和删除的一端称为栈顶,另一端称为栈底。

从栈的特性中我们能发现:1).栈是一种后进先出的线性表,因为栈只有一个出入口,每次出栈是最后进的那个先出去,后一个才能出去,就像我们出电梯一样,里面的人被阻住,只有外面的人出去,里面的人才能出去。

2)栈的栈顶是在变化的,所以栈还得有一个栈顶指针,新元素入栈的后,栈顶指针要指向新栈顶,栈顶栈顶元素出栈时,栈顶指针也是需要变化指向新的栈顶

栈的 三种状态-----栈空、栈满、栈未满

栈空时:栈顶指针(top)=-1

栈满时:栈顶指针(top)=MAXSIZE-1;

栈未满:就是占中存在元素,top指针还未达到MAXSIZE-1.

进栈和出栈操作

进栈

1).判断栈是否已经满了,如果满了当然就入不了栈。

2)、栈顶指针+1,在新栈顶位置存入要进栈的元素。

出栈:

1).判断栈是否为空,里面没有数据先出栈也没有。

2).将栈顶元素出栈,栈顶指针-1.

Java 实现栈的基本操作

package JavaStack;
import javax.swing.table.TableColumn;

/*
* 项目名称:JavaStack
* @author:wzc
* @date 创建时间:2017年9月10日 下午2:22:08
* @Description:数据结构----栈
* @parameter
*   */
public class Stack<T> {
   public static final int MAXSIZE=10;
private static final int T = 0;
   private T [] date=(T[])new Object[MAXSIZE];
   int top;
   public Stack() {
    top=-1;
   }
   //判断栈是否为空
   public boolean isEmpty(){
       if (top==-1) {
        return true;
       }
        return false;
   }
   //判断栈是否满
   public boolean isFull(){
       if (top==MAXSIZE-1) {
        return true;
    }
       return false;
   }
   /*Method:push
     *Description:入栈操作
     *param:T date  入栈的数据元素
     */
   public void push(T date){
       //1.入栈之前判断是否栈满
       if (isFull()) {
           System.out.println("栈已经满了");
           return;
       }
       top=top+1;
       this.date[top]=date;
       System.out.println(date+"已经入栈");
   }
   /*Method:enclosing_method
     *Description:出栈操作
     *param:
     */
   public T pop(){
       //出栈之前判断呢栈是否为空
       if (isEmpty()) {
        System.out.println("栈为空,无可出栈数据");
        return null;
      }
       T date= this.date[top];
       top=top-1;
       return date;
   }
   //输出栈 中有多少元素
   public int getLength(){
       return top+1;
   }
   //输出栈中所有元素
   public void getDate(){
       for(int  i=0;i<=top;i++){
           System.out.print(date[i]+" ");
       }
       System.out.println();
   }

}

测试一下:

@Test
    public void test() {
        Stack <Integer> stack=new Stack<>();
        int length = stack.getLength();
        System.out.println("栈长:"+length);
        stack.push(2);
        System.out.println("栈长"+stack.getLength());
        stack.push(5);
        stack.push(9);
        System.out.println("栈长"+stack.getLength());
        stack.getDate();
        Integer pop = stack.pop();
        System.out.println(pop+"出栈");
        System.out.println("栈长"+stack.getLength());
        stack.getDate();
        stack.pop();
        stack.pop();
        System.out.println("栈长"+stack.getLength());
        stack.getDate();
        stack.pop();
    }

测试结果::

共享栈

共享栈 是开辟一块内存空间,两个栈结构共用这一块内存空间,每个栈占领这块空间的一头。

要求:两个栈的数据类型要相同。

栈满:判断栈满的条件是----top1+1=top2

栈空: 1.第一个栈空的条件:top=-1

2.第二个栈空的 条件:top2=MAXSIZE

在两个栈对于空间需求相反的时候,利用共享栈可以有效的节约空间。

package JavaStack;
/*
* 项目名称:JavaStack
* @author:wzc
* @date 创建时间:2017年9月10日 下午3:07:28
* @Description:共享栈
* @parameter
*   */
public class DoubleStack<T> {
    public static final int MAXSIZE=10;
    private T [] date=(T[])new Object[MAXSIZE];
    int top1;
    int top2;
    public DoubleStack() {
        top1=-1;
        top2=MAXSIZE;
    }
     //判断栈1是否为空
       public boolean isEmpty1(){
           if (top1==-1) {
            return true;
           }
            return false;
       }
       //判断栈2是否为空
       public boolean isEmpty2(){
           if (top2==MAXSIZE) {
            return true;
           }
            return false;
       }
       //判断栈是否满
       public boolean isFull(){
           if (top1+1==top2) {
            return true;
        }
           return false;
       }
       /*Method:push
         *Description:入栈操作
         *param:T date  入栈的数据元素,StackNum   哪个栈
         */
       public void push(T date,int StackNum){
           //1.入栈之前判断是否栈满
           if (isFull()) {
               System.out.println("栈已经满了");
               return;
           }
           if (StackNum==1) {
               top1=top1+1;
               this.date[top1]=date;
               System.out.println(date+"已经入栈");
           }else if (StackNum==2) {
               top2=top2-1;
               this.date[top2]=date;
               System.out.println(date+"已经入栈");
           }

       }
       /*Method:enclosing_method
         *Description:出栈操作
         *param:StackNum ,哪个栈
         */
       public T pop(int StackNum){
           //第一个栈出栈
           if (StackNum==1) {
             //出栈之前判断呢栈是否为空
               if (isEmpty1()) {
                    System.out.println("栈为空,无可出栈数据");
                    return null;
                  }
                   T date= this.date[top1];
                   top1=top1-1;
                   return date;
           }else   if (StackNum==2) {//第二个栈出栈
             //出栈之前判断呢栈是否为空
               if (isEmpty2()) {
                    System.out.println("栈为空,无可出栈数据");
                    return null;
                  }
                   T date= this.date[top2];
                   top2=top2+1;
                   return date;
           }
           //栈错误
           return null;

       }

}

栈的链式存储结构

利用单链表的思想,栈中元素在内存中的存储位置是随机的,只需要它的前驱能找到就行,然后对数据的操作仍然是从栈顶操作,依旧是后进先出。

对于进栈、出栈的实现思想还是一样。

入栈:

1.入栈元素的指针域指向当前栈顶指针top指向的元素。

2.top指针+1,指向新的栈顶元素。

出栈

1.将出栈元素出栈;

2.将top指针-1,指向下一个元素;

package JavaStack;
/*
* 项目名称:JavaStack
* @author:wzc
* @date 创建时间:2017年9月10日 下午3:26:54
* @Description:链式存储栈结构
* @parameter
*   */
public class LinkStack <T>{

    private class StackNode{
        T date;
        StackNode next;
    }
    private  StackNode top;
    private  int count;
    public LinkStack() {
        count =0;
        top=null;
    }
    //判读是否为空
    public boolean isEmpty(){
        if (count==0) {
            return true;
        }
        return false;
    }
    /*Method:push
     *Description:入栈操作
     *param:date 入栈元素
     */
    public void push(T date){
        StackNode newNode=new StackNode();
        newNode.date=date;
        newNode.next=top;
        top=newNode;
        count++;
        System.out.println(date+"入栈");
    }
    /*Method:pop
     *Description:出栈操作
     *param:
     */
    public T pop(){
        if (isEmpty()) {
            return null;
        }
        StackNode date=top;
        top=top.next;
        date.next=null;
        System.out.println(date.date+"出栈");
        return  date.date;
    }

    public void getDate(){
        StackNode tmp=top;
        while(tmp!=null){
            System.out.print(tmp.date+" ");
            tmp=tmp.next;
        }
        System.out.println();
    }

}
时间: 2024-10-09 20:48:36

大话数据结构----栈的相关文章

大话数据结构 栈与队列

栈是限定仅在表尾进行插入和删除操作的线性表. 我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈.栈又称为后进先出的线性表,简称LIFO结构. 栈的插入操作,叫作进栈,也称压栈.入栈. 栈的删除操作,叫作出栈,也有的叫作弹栈. 栈的抽象数据类型 ADT 栈(stack) Data 同线性表.元素具有相同的类型,相邻元素具有前驱和后继关系. Operation InitStack(*S): 初始化操作,建立一个空栈S. DestroyStack(*S): 若栈存在,则

链栈--(大话数据结构97页)

//链栈的实现 --大话数据结构99页 #include <iostream> using namespace std; //链节点定义 typedef struct stacknode { int data; struct stacknode * next; }StackNode, *LinkStackptr; //定义链栈,头指针 和 长度 struct LinkStack{ LinkStackptr top; int count; }; //初始化void InitStack(LinkS

大话数据结构——使用栈实现简单的四则运算

最近在读<大话数据结构>,里面有个例子是使用栈实现四则运算,现在我用java把这个功能实现试试 代码如下: package com.datastruct; import java.util.ArrayList; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; public class StackPractice { private static ArrayList&l

【Java】 大话数据结构(6) 线性表之栈

本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所示.   1.栈的顺序存储结构 用数组存放数据,top变量来指示栈顶元素在数组中的位置(栈顶指针).一个长度为5的栈的示意图如下: 实现程序: /** * 栈的顺序储存结构 * * 问题:构造器中,泛型数组创建是否有更好的方法? * @author Yongh * */ public class SqStac

南阳OJ-2 括号配对 (数据结构-栈的应用)

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

《大话数据结构》学习笔记 排序

排序的严格定义:  假设含有n个记录的序列为{r1,r2,......,rn},对应的关键字分别为{k1,k2......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字 满足Kp1<=Kp2<=......Kpn关系,即使得序列成为一个按关键字有序的序列(rpq,rp2,......rpn),此操作称为排序.  排序的稳定性:内排序与外排序(根据记录是否全部放置在内存中). 根据排序中的主要操作,可以分为插入排序类(直接插入排序->希尔

poj 2082 Terrible Sets (数据结构 ——栈 STL)

 Terrible Sets Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2999   Accepted: 1549 Description Let N be the set of all natural numbers {0 , 1 , 2 , . . . }, and R be the set of all real numbers. wi, hi for i = 1 . . . n are some elem

数据结构——栈——寻找下一个较大元素

题目描述 给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-1 举例 {4,6,1,3,2,5} 则求得的答案应为 {6,-1,3,5,5,-1} 题目分析 首先对于这样的题目,我们总是先想到最简单的,那么就是枚举,每次循环一个元素,不停的向右找就可以了.时间复杂度应该是n^2 但是这样肯定是不够用的. 然后我们考虑,这道题我们实际上遇到的问题是什么? 其实简单的说,这道题的意思是,在变化的数组中找到下一个较大的值. 难点在于,数组元素的变化,以及不是找最大值,而是找下一个较大

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的