顺序栈是利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的元素数据。分别使用top指针和base指针指向栈顶和栈底。

- 栈为空的标志是:top==base.
- 要注意的是:非空栈的栈顶指针总是指向栈顶元素的上一个位置。
- 栈满时的处理方法:
- 1、报错,返回操作系统。
- 2、分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈。
1.顺序栈的表示
#define MAXSIZE 100
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack
2.顺序栈初始化
- 算法步骤
- 1、分配空间并检查空间是否分配失败,若失败则返回错误
- 2、设置栈底和栈顶指针:S.top = S.base;此处要注意语句应该是S.top=S.base 而不是S.base=S.top
- 3、设置栈大小
- 算法描述
int InitStack(SqStack &S)
{
S.base=new int[MAX]; // 为顺序栈动态分配一个最大容量为MAX的数组空间
if(!S.base)
{
return 0;
}
S.top=S.base;
S.stacksize=MAX;
return 1;
}
2.判断顺序栈是否为空
int StackEmpty( SqStack S )
{
if(S.top == S.base)
return 0; // 为空
else
return 1; // 非空
}
3.求顺序栈的长度
int StackLength(SqStack S)
{
return S.top – S.base;
}
4.清空顺序栈
int ClearStack(SqStack S)
{
if(S.base)
S.top = S.base;
return 1;
}
5.销毁顺序栈
Status DestroyStack(SqStack &S)
{
if(S.base)
{
delete S.base ;
S.stacksize = 0;
S.base = S.top = NULL;
}
return 1;
}
6.顺序栈入栈
- 算法步骤
- 1、判断是否栈满,若满则出错
- 2、元素e压入栈顶
- 3、栈顶指针加1
- 算法描述
int Push_S(SqStack &S,int e)
{
//将元素e入栈
if(S.top-S.base==S.stacksize) //判断栈是否满
{
return 0;
}
*S.top =e; // *S.top=e; S.top ;
return 1;
}
7.顺序栈出栈
- 算法步骤
- 1、判断是否栈空,若空则出错
- 2、栈顶指针减1
- 3、栈顶元素出栈
- 算法描述
//出栈
int Pop_S(SqStack &S,int &e)
{
//用e返回出栈的元素
if(S.top==S.base)
{//栈空
return 0;
}
e=*--S.top; // --S.top;e=*S.top;
return 1;
}
8.取栈顶元素
- 算法步骤
- 判断是否空栈,若空则返回错误,否则通过栈顶指针获取栈顶元素
- 算法描述
int GetTop( SqStack S, SElemType &e)
{
if( S.top == S.base )
return 0; // 栈空
e = *(S.top – 1);
return 1;
}
9.代码实现
#include <iostream>
using namespace std;
#define MAX 100
//顺序栈的定义
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
//初始化
int InitStack(SqStack &S)
{
S.base = new int[MAX]; // 为顺序栈动态分配一个最大容量为MAX的数组空间
if (!S.base)
{
return 0;
}
S.top = S.base;//初始化将栈置空,就是让头指针指向尾指针,从语句上讲就是把尾指针的值赋值给头指针
S.stacksize = MAX;
return 1;
}
//入栈
int Push_S(SqStack &S, int e)
{
//将元素e入栈
if (S.top - S.base == S.stacksize) // 判断栈是否满
{
return 0;
}
*S.top = e; // *S.top=e; S.top ;
return 1;
}
//出栈
int Pop_S(SqStack &S, int &e)
{
//用e返回出栈的元素
if (S.top == S.base) // 判断栈是否为空
{
return 0;
}
e = *--S.top; // --S.top;e=*S.top;
return 1;
}
// 取栈顶元素
int GetTop( SqStack S, int &e)
{
if (S.top == S.base)
return 0; // 栈空
e = *(S.top - 1);
return 1;
}
int main()
{
SqStack S;
if (InitStack(S))
{
printf("顺序栈初始化成功!\n");
}
else
{
printf("顺序栈初始化失败!\n");
}
int loop = 1;
int e1;
int i = 1;
// 入栈
printf("请输入入栈元素(输入0终止):\n");
while (loop)
{
printf("请输入第%d个元素值:",i );
scanf("%d", &e1);
if (e1 != 0)
{
Push_S(S,e1);
}
else if (e1 == 0)
{
loop = 0;
}
}
// 取栈顶元素
int e2;
GetTop(S, e2);
printf("栈顶元素是:%d\n", e2);
// 出栈
int e3; int j = 1;
while (S.top != S.base)
{
Pop_S(S, e3);
printf("第%d个出栈的元素是:%d\n",j ,e3);
}
system("pause");
return 0;
}

来源:https://www./content-4-286801.html
|