传统的顺序表可以实现从随机存取,但栈是一个只允许从一头输入一头输出的受限制的线性表。n个不同的元素有n+1分之1乘以Cn2n个可能性。
由于顺序栈十分简单,不再通过复杂的方式去解释,采用顺序存储的栈称为顺序栈,它利用一组连续的存储单元存放自栈底到栈顶的数据元素,并且附设了一个指针(top)指向当前栈顶的元素位置。
栈顶指针S.top,初始时设置为S.top=-1。栈顶元素:S.data[S.top]。
进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素。若是S.top==0的话就先送入数据再加1。
出栈操作:栈非空时,先取栈顶元素,再讲栈顶指针减1。若是S.top==0的话则先栈顶指针减1然后再减1。
栈空条件S.top==-1或者S.top==0。栈满条件:S.top==Maxsize-1或者S.top==Maxsize,栈长:S.top+1或者S.top。
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)
//顺序栈的定义
typedef struct
{
int data[maxsize] = {0};
int top;//定义一个指向栈顶的指针
}SqStack;
//顺序栈的初始化
int InitStack(SqStack& S) //将顺序栈地址传入
{
S.top = -1;//先指向栈底
return 1;
}
//顺序栈的判空
int StackEmpty(SqStack S)
{
if (S.top == -1)return 1;
return 0;
}
//顺序栈的判满
int StackFull(SqStack S)
{
if (S.top == maxsize - 1)return 1;
return 0;
}
//顺序栈的求长
int StackLength(SqStack S)
{
return S.top + 1;
}
//顺序栈入栈
int PushStack(SqStack& S,int e)
{
if (S.top == maxsize - 1)return 0;//说明栈满
S.data[++S.top] = e;
return 1;
}
//顺序栈出栈
int PopStack(SqStack&S,int &e)
{
if (S.top == -1)return 0;//说明栈空
e = S.data[S.top--];
return 1;
}
//读取顺序栈栈顶元素
int GetTop(SqStack S,int &e)
{
if (S.top == -1)return 0;//说明栈空无法返回数值
e = S.data[S.top];
return 1;
}
void main()
{
SqStack S;
int i, e;
InitStack(S);
printf("栈顶是%d\n", S.top);
printf("顺序栈的入栈:\n");
e = StackEmpty(S);
printf("此时的栈是否空:%d\n",e);
for(i=1;i<=maxsize;i++)
{
PushStack(S, i);
}
e=StackFull(S);
printf("此时栈是否满:%d\n",e);
printf("出栈数据为:");
for (i = 1; i < 5; i++)
{
PopStack(S, e);
printf("%d ", e);
}
printf("\n");
e = StackLength(S);
printf("此时的栈长为:%d\n", e);
e = GetTop(S, i);
printf("此时的栈头元素是:%d\n", i);
}
经测试,能够实现简单的操作,考研仅供自己复习,还希望大家多多批评交流。顺序栈是简化的顺序表因为不算男一看就懂。