目录
- 一、栈的相关知识
- 二、顺序栈的定义
- 三、顺序栈的初始化
- 四、判断顺序栈是否为空栈
- 五、判断顺序栈是否为满栈
- 六、进栈(插入操作)
- 七、出栈(删除操作)
- 八、读取顺序栈顶元素
- 九、顺序栈的建立
- 十、栈的遍历输出
一、栈的相关知识
- 栈是一种只允许在一端进行插入或删除操作的线性表,它是一种
特殊的线性表
,其遵循的原则是先进后出
(FILO),即后进的元素先被取出来。由于它是一种线性表,所以有两种方式:顺序存储结构和链式存储结构表示,即顺序栈
和链式栈
。

其中,栈的插入操作称为进栈
,栈的删除操作称为出栈
。
二、顺序栈的定义
通过一组数组地址的连续的存储单元来存放从栈底开始至栈顶的数据元素,同时设置一个栈顶指针top,用于指示当前栈顶元素的位置
,代码如下:
#define MaxSize 20
typedef struct {
int data[MaxSize];
int top;
} SqStack;
我们可以得到,由于c语言中数组的下标是从0开始的,所以栈的总长度为S.top+1
,即要加1。
三、顺序栈的初始化
初始化一个顺序栈,这里的参数SqStack &S,带有“&”,表示引用调用,即对参数的修改结果进行带回,栈顶指针为S.top
,栈顶元素的值为S.data[S.top]
,初始化时定义S.top=-1
表示顺序栈为空,而当S.top=0
时,表示栈中只存在一个元素,代码如下:
void InitStack(SqStack &S) {
S.top=-1;
}
四、判断顺序栈是否为空栈
可以得到,判断顺序栈是否为空栈的条件是S.top==-1
,表示此时顺序栈中为空栈
,无任何元素,代码如下:
bool StackEmpty(SqStack S) {
if(S.top==-1)
return true;
else
return false;
}
五、判断顺序栈是否为满栈
判断顺序栈是否为空栈的条件是S.top==MaxSize-1
,由于c语言数组下标从0开始的,栈中元素最大个数MaxSize要减1,即当top=MaxSize-1时,表示此时顺序栈中已满,无法再存入元素,代码如下:
bool StackFull(SqStack S) {
if(S.top==MaxSize-1)
return true;
else
return false;
}
六、进栈(插入操作)
将一个元素插入顺序栈中,即进栈,由于进栈后元素个数有变化,所以要用引用“&”,即SqStack &S,首先判断顺序栈是否已满,然后在新的元素进栈前,所以栈顶指针要先加1,即++S.top
,然后将进栈元素的值传入并将其入栈,如下:
++S.top;
S.data[S.top]=x;
这两行代码也可以使用一行代码:S.data[++S.top]=x
直接替换。
进栈操作的完整代码如下:
bool StackPush(SqStack &S,int x) {
if(S.top==MaxSize-1)
return false;
++S.top;
S.data[S.top]=x;
return true;
}
七、出栈(删除操作)
将一个元素从顺序栈中删除,即出栈,由于栈的特性,只能先进后出,即从栈顶进行删除操作然后依次,同样出栈后元素个数有变化,所以要用引用“&”,即SqStack &S,首先判断顺序栈是否为空,元素出栈后(将栈顶元素赋给x),然后栈顶指针要减1,如下:
x=S.data[S.top];
S.top--;
这两行代码也可以使用一行代码:x=S.data[S.top--]
直接替换。
出栈操作的完整代码如下:
bool StackPop(SqStack &S,int x) {
if(S.top==-1)
return false;
x=S.data[S.top];
S.top--;
return true;
}
八、读取顺序栈顶元素
读取顺序栈顶元素,这里并没有将栈顶元素取出(无出栈操作),首先判断当前顺序栈是否为空,然后通过x来记录栈顶元素,如下:
bool StackGetTop(SqStack S,int &x) {
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
九、顺序栈的建立
顺序栈的建立中输入一个值代表要创建的栈的元素个数,然后通过一个for循环建立顺序栈,其中使用到栈的进栈操作,每次向栈中插入元素,代码如下:
void CreateStack(SqStack &S,int x){
int number;
printf("请输入要建立栈的元素个数:\n");
scanf("%d",&number);
for(int i=0; i<number; i++) {
printf("输入第%d个入栈的元素:\n",i+1);
scanf("%d",&x);
StackPush(S,x);
}
}
一个简单的顺序栈的基本实现例子
例如,创建一个顺序栈,栈中元素从栈底到栈顶依次为1,2,3,4,5,第一步首先输出当前栈顶元素;第二步通过用户输入一个要进栈的元素“6”,并输出进栈后此时的栈顶元素;第三步通过执行一次出栈操作后,然后再输出此时的栈顶元素。
实现代码如下:
#include
#define MaxSize 20
typedef struct {
int data[MaxSize];
int top;
} SqStack;
void InitStack(SqStack &S) {
S.top=-1;
}
bool StackEmpty(SqStack S) {
if(S.top==-1)
return true;
else
return false;
}
bool StackFull(SqStack S) {
if(S.top==MaxSize-1)
return true;
else
return false;
}
bool StackPush(SqStack &S,int x) {
if(S.top==MaxSize-1)
return false;
++S.top;
S.data[S.top]=x;
return true;
}
bool StackPop(SqStack &S,int x) {
if(S.top==-1)
return false;
x=S.data[S.top];
S.top--;
return true;
}
bool StackGetTop(SqStack S,int &x) {
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
void CreateStack(SqStack &S,int x) {
int number;
printf("请输入要建立栈的元素个数:\n");
scanf("%d",&number);
for(int i=0; i<number; i++) {
printf("输入第%d个入栈的元素:\n",i+1);
scanf("%d",&x);
StackPush(S,x);
}
}
int main() {
SqStack S;
int x,e;
InitStack(S);
CreateStack(S,x);
StackGetTop(S,x);
printf("读取栈顶元素,当前栈顶元素为:%d\n",x);
printf("输入一个要进栈的元素:");
scanf("%d",&e);
StackPush(S,e);
StackGetTop(S,x);
printf("读取栈顶元素,当前栈顶元素为:%d\n",x);
StackPop(S,x);
StackGetTop(S,x);
printf("执行一次出栈操作后,当前栈顶元素为:%d",x);
}
运行结果如下:

十、栈的遍历输出
首先判断顺序栈是否为空,然后通过while循环,当S.top!=-1时一直执行下去,每次输出栈顶的元素,然后再减1,如下代码:
bool PrintStack(SqStack S,int x){
if(S.top==-1)
return false;
while(S.top!=-1){
x=S.data[S.top--];
printf("%d ",x);
}
return true;
}
例如,下列代码:
#include
#define MaxSize 20
typedef struct {
int data[MaxSize];
int top;
} SqStack;
void InitStack(SqStack &S) {
S.top=-1;
}
bool StackEmpty(SqStack S) {
if(S.top==-1)
return true;
else
return false;
}
bool StackFull(SqStack S) {
if(S.top==MaxSize-1)
return true;
else
return false;
}
bool StackPush(SqStack &S,int x) {
if(S.top==MaxSize-1)
return false;
++S.top;
S.data[S.top]=x;
return true;
}
bool StackPop(SqStack &S,int x) {
if(S.top==-1)
return false;
x=S.data[S.top];
S.top--;
return true;
}
bool StackGetTop(SqStack S,int &x) {
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
void CreateStack(SqStack &S,int x) {
int number;
printf("请输入要建立栈的元素个数:\n");
scanf("%d",&number);
for(int i=0; i<number; i++) {
printf("输入第%d个入栈的元素:\n",i+1);
scanf("%d",&x);
StackPush(S,x);
}
}
bool PrintStack(SqStack S,int x){
if(S.top==-1)
return false;
while(S.top!=-1){
x=S.data[S.top--];
printf("%d ",x);
}
return true;
}
int main() {
SqStack S;
int x;
InitStack(S);
CreateStack(S,x);
StackGetTop(S,x);
printf("读取栈顶元素,当前栈顶元素为:%d\n",x);
printf("从栈顶到栈底的元素(出栈顺序)依次为:");
PrintStack(S,x);
}
运行结果如下:
