您的位置:首页 > 其它

顺序栈,两栈共享空间,链栈

2016-03-10 21:37 489 查看

1.顺序栈的基本操作:

栈是一种特殊的线性表,线性表的顺序存储结构和链式存储结构同样适用于栈。LIFO
应用:浏览网页时的撤销回退操作
#include <iostream>
#include <cstdio>
using namespace std;
#define MAXSIZE 1000
typedef int SElemType;
typedef struct
{
SElemType data[MAXSIZE];
int top;
}SqStack;
void Push(SqStack *s,SElemType e)
{
if(s->top==MAXSIZE-1)
{
printf("栈已满!,不能入栈\n");
}else{
s->top++;
s->data[s->top]=e;
printf("已成功入栈\n");
}
}
void Pop(SqStack *s)
{
if(s->top==-1)
{
printf("栈为空!,不能出栈\n");
}else{
s->top--;
printf("已成功出栈\n");
}
}
int GetStackTop(SqStack *s)
{
return s->data[s->top];
}
int main()
{
SqStack p;
p.top = -1;//p.top而不能是p->top
int a,x;
do{
printf("请选择进栈(1)or出栈操作(2)取栈顶元素(3)退出(4):");
cin>>a;
switch(a)
{
case 1:printf("请输入元素:");
scanf("%d",&x);
Push(&p,x);
break;
case 2:Pop(&p);
break;
case 3:printf("栈顶元素为:%d\n",GetStackTop(&p));
}
}while(a!=4);
return 0;
}


2.两栈共享空间:

顺序栈存储空间的大小需要事先申请,不方便。
可以两栈共享空间,不过这种情况适用于一个栈的大小不断增大,另一个栈的大小不断减小。而且必须两栈存储相同数据类型的元素。例如:(买彩票)

#include <iostream>
#include <cstdio>
using namespace std;
#define MAXSIZE 10
typedef int SElemType;
typedef struct
{
SElemType data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack;
void Push(SqDoubleStack *s,int stackNumber,SElemType e)
{
if(s->top1+1==s->top2)
{
printf("栈已满,不能入栈\n");
}else
{
if(stackNumber==1)
{
s->data[++s->top1]=e;
printf("入栈1成功!\n");
}

if(stackNumber==2)
{
s->data[--s->top2]=e;
printf("入栈2成功!\n");
}

}
}
int Pop(SqDoubleStack *s,int stackNumber)
{
SElemType e;
if(stackNumber==1)
{
if(s->top1==-1)
{
printf("栈1空,出栈失败!\n");
}else
{
e=s->data[s->top1--];

printf("出栈1成功\n");
}

}
if(stackNumber==2)
{
if(s->top2==MAXSIZE-1)
{
printf("栈2空,出栈失败!\n");
}else
{
e=s->data[s->top2++];

printf("出栈2成功\n");
}

}
return e;
}
void output(SqDoubleStack *s)
{
int i;
for(i=0;i<MAXSIZE;i++)
{
if(s->data[i])
printf("%d ",s->data[i]);
}
}
int main()
{
SElemType e;
SqDoubleStack s;
int stackNumber;
int x,i;
s.top1=-1;
s.top2=MAXSIZE;

do{
printf("选择入栈(1)出栈(2)输出栈(3)退出(4)");
scanf("%d",&i);
switch(i)
{
case 1:
printf("\n输入要入栈的元素:");
scanf("%d",&x);
printf("\n选择入栈1 or 栈2::");
scanf("%d",&stackNumber);
Push(&s,stackNumber,x);
break;
case 2:printf("选择出栈1 or栈2:");
scanf("%d",&stackNumber);
e=Pop(&s,stackNumber);
printf("出栈的元素为%d\n",e);
break;
case 3: printf("\n输出栈:");
output(&s);
break;

}
}while(i!=4);

return 0;
}


3.链栈的基本操作

链式存储结构头头指针,栈有指向栈顶的指针,可以将二者合二为一,不需要头结点;
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef int SElemType;
typedef struct StackNode
{
SElemType data;
StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
void Push(LinkStack *S,SElemType e)
{
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
p->data=e;
p->next = S->top;
S->top = p;
S->count++;
}
int Pop(LinkStack *S)
{
LinkStackPtr p;
SElemType e;
if(S->count==0)
{
printf("栈为空,不能出栈\n");
}else
{
p=S->top;
e=p->data;
S->top = p->next;
free(p);
S->count--;
}
return e;
}
int main()
{
LinkStack S;
SElemType e;
int i,x;
S.count=0;
do
{
printf("\n请选择入栈(1)or出栈(2)or 退出(3):\n");
scanf("%d",&i);
switch(i)
{
case 1: printf("请输入入栈元素:");
scanf("%d",&x);
Push(&S,x);
break;
case 2: e=Pop(&S);
printf("出栈元素为%d",e);
break;
}
}while(i!=3);

return 0;
}

4.顺序栈与链栈的区别:

两者的Push和Pop操作时间复杂度都为O(1);
顺序栈需要事先确定存储空间的大小,容易造成空间的浪费。但是在存取时定位很方便。
链栈的每个节点都需要一个指针域,需要额外的内存开销,不过可以动态的申请和释放空间。
如果栈的大小可以事先预测,可以选择顺序栈。反之,可以选择链栈。

5.栈的应用:

递归



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: