栈是限制线性表中元素的插入和删除只能在线性表同一端进行操作的一种特殊的线性表,允许插入和删除的一端称为栈顶,另一端固定为栈底。
注意:操作只能在栈顶进行操作。
我个人觉得栈还是很好理解的,就不做过多介绍。
栈的共享存储单元:一个数组实现两个栈。
如下图所示,分配一个数组空间,分别在数组的两边实现一个栈,
(1)将所分配的数组空间的最小位置和最大位置分别设置为两个栈的栈顶top1和top2。
(2)对于第一个栈,若入栈,则top1++。对于第二个栈,若入栈,则top2–。分配的数组空间,使用时,由两边向中间。当top1+1==top2时,即表示数组满,即空间满,不可以在进行入栈操作。
(3)具体是对哪一个栈进行操作,我们设置一个标记tag来标记,若tag为0,对第一个栈进行操作。否则为第二个栈。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#include<iostream>
typedef int tag;//用tag来标记是哪个栈
using namespace std;
typedef struct stack
{
int data[MAXSIZE];
int top1;
int top2;;
}Mystack;
Mystack *Initial()
{
Mystack *mystack=(Mystack*)malloc(sizeof(struct stack));
mystack->top1=-1;//注意这里是-1,若是为0的话,其实第一个位置是给初始化浪费了的
mystack->top2=MAXSIZE-1;
return mystack;
}
int Push(Mystack *stack,int P,tag X)
{
if(stack->top1!=stack->top2-1)//判断栈未满
{
if(X==0)
{
stack->data[++stack->top1]=P;
}
else
{
stack->data[--stack->top2]=P;
}
return 0;
}
cout<<"栈满,插入失败";
return 0;
}
int Pop(Mystack *stack,tag X)
{
if(X==0)
{
if(stack->top1==-1)//注意这里也是-1
{
cout<<"栈1空";
return 0;
}
else
{
return stack->data[(stack->top1)--];
}
}
else
{
if(stack->top2==MAXSIZE-1)
{
cout<<"栈2空";
return 0;
}
return stack->data[(stack->top2)++];
//stack->top2++;
}
// return 0;
}
void Show(Mystack *stack,tag X)
{
int i;//注意在打印栈的函数里,要重新定义一个变量来
代替栈顶的位置,不然打印之后,会改变栈顶的位置,造成后续
操作失误。
if(X==0)
{
i=stack->top1;
while(i!=-1)
{
cout<<stack->data[i]<<" ";
i--;
}
}
else
{
i=stack->top2;
while(i!=MAXSIZE-1)
{
cout<<stack->data[i]<<" ";
i++;
}
}
}
int main()
{
Mystack *mystack=Initial();
Push(mystack,2,0);//压入第一个栈
Push(mystack,4,0);
Push(mystack,6,0);
//cout<<mystack->top1;
Push(mystack,7,0);
Show(mystack,0);
//cout<<mystack->top1;
cout<<std::endl;
Push(mystack,3,1);
Push(mystack,5,1);
Show(mystack,1);
cout<<std::endl;
Pop(mystack,0);
Show(mystack,0);
/*Pop(mystack,0);
cout<<std::endl;
Show(mystack,0);*/
return 0;
}
链栈:
栈的链式存储结构,是一种限制运算的链表,即规定链表中插入和删除运算都只能在链表开头进行。
为什么是头部呢:链栈是单链表结构。若对链栈的尾部进行操作,要先查找到链栈的尾部。然而,要查找到,必须每次都从头开始查找。相比于头部,尾部需要耗费更大的时间,具有更低的效率。
关于的链栈的实现,不做过多介绍。其实现跟单链表差不多,但是限定操作都只能在单链表的头部进行。(单链表的实现在前几篇有实现过啦!)
共同进步,永远向前!