栈的入栈和出栈的顺序规律是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的入栈和出栈的顺序规律是啥?相关的知识,希望对你有一定的参考价值。

入栈的顺序规律是排在前面的先进,排在后面的后进。

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。

首先系统或者数据结构栈中数据内容的读取与插入(压入push和 弹出pop)是两回事!压入是增加数据,弹出是删除数据 ,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作 ,但读取栈中的数据是随便的没有接口约束之说。

很多人都误解这个理念从而对栈产生困惑。而系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用 即 cpu 与内存的交流通道 ,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令, 用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见 EU与BIU的概念介绍。

参考技术A 数据结构中,栈的入栈与出栈的顺序规律可用一句话来描述,即先进后出,后进先出。 参考技术B 栈是从栈顶进,从栈顶出,是保持先入后出的原则的,一出数字进去,直接全出顺序就会和进的时候反过来 参考技术C 栈是按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。 参考技术D 栈是一种数据结构,样子具体话的就像一个桶,遵循先进后出的规矩的。

栈的操作实验(数据结构)

数据结构中栈的操作实验

一、实验目的

1.掌握栈的存储结构的表示和实现方法。
2.掌握栈的入栈和出栈等基本操作算法实现。
3.了解栈在解决实际问题中的简单应用。

二、实验内容

1.建立顺序栈,并在顺序栈上实现入栈和出栈操作(验证性内容)。
2.建立链栈,并在链栈上实现入栈和出栈操作(设计性内容)。
3.实现“回文检测”求解问题(应用性设计内容)。

三、实验的软硬件环境要求

硬件环境要求: PC机(单机)
使用的软件名称、版本号以及模块: Windows环境下的TurboC2.0以上或VC++等。

四、知识准备

前期要求熟练掌握了C语言的编程规则、方法和顺序栈、链栈的基本操作算法。

五、验证性实验

1.实验要求

编程实现如下功能:

(1)根据输入的栈中元素个数n和各元素值建立一个顺序栈,并输出栈中各元素值。
(2)将数据元素e入栈,并输出入栈后的顺序栈中各元素值。
(3)将顺序栈中的栈顶元素出栈,并输出出栈元素的值和出栈后顺序栈中各元素值。

2. 实验相关原理:

栈是一种插入和删除操作都限制在表的一端进行的特殊线性表,它的操作具有“先进后出”的特性。采用顺序存储结构的栈称为顺序栈。栈的存储结构描述如下:

#define MAXSIZE 100; /*顺序栈的最大长度*/
typedef struct 
  Selemtype base[MAXSIZE];  /*存储栈中数据元素的数组*/
    int top;   /*top为栈顶指针,它指示栈顶元素的存储空间的下一个存储单元*/
 Sqstack;

【核心算法提示】

1.顺序栈入栈操作的基本步骤:首先判断顺序栈是否为满,如果满,则函数返回ERROR,否则将待入栈的数据元素存放在top所指示的存储单元中,再使top后移一个存储单元位置,即将top值加1,最后函数返回OK。
2. 顺序栈出栈操作的基本步骤:首先判断顺序栈是否为空,如果空,则函数返回ERROR,否则将栈顶指针前移一个存储单元位置,即将top值减1,再将top所指示的栈顶元素用e返回其值,并使函数返回OK。

【核心算法描述】

status Push(Sqstack &S,Selemtype e)
/*将数据元素e压入到顺序栈S中,使其成为新的栈项元素*/
   if (S.top >=MAXSIZE)  /*如果栈满,则函数返回ERROR*/
        return ERROR;
    S.base[S.top++]=e;/*将新元素e存放在top所指示的存储单元中,并使top值加1*/
    return OK;
  
status Pop(Sqstack &S,Selemtype &e)
/*将顺序栈S中的栈顶元素从栈中删除,并用e返回其值*/
   if (S.top==0)    /*如果栈空,则函数返回ERROR*/
       Return ERROR;
    e=S.base[--S.top];/*将top值减1,并用e保存top所指示的栈顶元素值*/
    return OK;
  

3.源程序代码参考

#define MAXSIZE 100
typedef struct
    int base[MAXSIZE];
     int top;    /*top指示存储栈顶元素的下一存储单元*/
  Sqstack;   /*顺序栈的类型定义*/
Sqstack Push(Sqstack S,int e)  /*顺序栈的入栈操作函数*/
   if (S.top>=MAXSIZE)
        printf("Stack is Overflow\\n");
else 
 S.base[S.top++]=e;/*将新元素e存放在top所指示的存储单元中,并使top值加1*/
    return S;
  
Sqstack Pop(Sqstack S,int *e) /*顺序栈的出栈操作函数*/
   if (S.top==0)
       printf("Stack is Empty\\n");
else 
 e=S.base[--S.top];/*将top值减1,并用e保存top所指示的栈顶元素值*/
    return S;
  
void Stack_display(Sqstack S) /*顺序栈的输出函数*/
   int i;
    for(i=0; i<S.top;i++)   /*依次输出栈中各元素的值,栈顶元素在表的尾部*/
      printf("%4d", S.base[i]);    
    printf("\\n");
  
main()
   Sqstack S;
    int i,j,n,x,e;
    printf("please input the length:");/*请求输入顺序栈中元素个数*/
    scanf("%d",&n);
    printf("please input the Value:\\n  ");/*请求输入顺序栈中各个元素值*/
    for(i=0;i<n;i++)
       scanf("%d",&S.base[i]);
    S.top=n;
    printf("the stack is:\\n");
    Stack_display(S);
    printf("please input the insert node:");/*请求输入需要入栈的新元素*/
    scanf("%d",&x);
    S=Push(S,x);
    printf("the stack after push is:\\n");/*提示输出入栈后栈中各个元素值*/
    Stack_display(S);   /*调用顺序栈的输出函数*/
    S=Pop(S,&e);
    printf("the pop value is:%d\\n",e);  /*输出出栈元素的值*/
    printf("the stack after pop is:\\n");/*提示输出出栈后栈中各个元素值*/
    Stack_display(S);   /*调用顺序栈的输出函数*/
  

4.运行结果参考如图3-1所示:


以上是关于栈的入栈和出栈的顺序规律是啥?的主要内容,如果未能解决你的问题,请参考以下文章

若已知一个栈的入栈顺序是1,2,3,...,n,其输出序列为P1,P2,P3,...,Pn,若P1是n,则Pi是

JAVA 方法的入栈出栈问题

如何用函数实现入栈和出栈

栈的操作实验(数据结构)

栈的操作实验(数据结构)

栈的操作实验(数据结构)