栈的逻辑结构
栈的定义
栈是限定仅在表的一段进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称之为空栈。栈具有后进先出的特性。
栈 的顺序存储结构–顺序栈
栈的顺序存储结构称之为顺序栈。
顺序栈的C语言实现
#include<stdio.h>
#include<stdlib.h>
//假设栈元素最多100个
#define StackSize 100
//定义栈的数据类型为int
typedef int DataType;
//定义栈的结构体
typedef struct{
//存放栈元素的数组
DataType data[StackSize];
//栈顶位置,栈顶元素在数组的下标
int top;
}SeqStack;
//栈的初始化
//初始化一个空的顺序栈,只需将栈顶位置top置为-1
void InitStack(SeqStack * S){
S->top = -1;
}
//顺序栈的销毁
//顺序栈是静态存储分配,在顺序栈变量退出作用域时自动释放顺序栈所占的存储单元,即,顺序栈无需销毁。
//入栈操作
int Push(SeqStack * S ,DataType x){
if(S->top == StackSize -1){
printf("上溢错误,插入失败\n");
return 0;
}
S->data[++S->top] = x;
return 1;
}
//出栈操作
int Pop(SeqStack * S,DataType * ptr){
if(S->top == -1 ){
printf("下溢错误,删除失败\n");
return 0;
}
//top-- 操作先赋值,在进行运算。即在结束时,top自动减一。
//被删除的元素通过ptr指针返回
*ptr = S->data[S->top--];
return 1;
}
//取栈顶元素
int GetTop(SeqStack * S,DataType * ptr){
if(S->top == -1){
printf("下溢错误,取栈顶失败\n");
return 0;
}
*ptr = S->data[S->top];
return 1;
}
//判空操作
int Empty(SeqStack * S ){
if(S->top == -1)
return 1;
else
return 0;
}
//顺序栈的使用
int main(){
DataType x;
SeqStack S;
//初始化
InitStack(&S);
printf("对1 2 3进行入栈操作\n");
Push(&S,1);
Push(&S,2);
Push(&S,3);
if(GetTop(&S,&x) == 1){
printf("栈顶元素为%d\n",x);
}
//进行出栈操作
Pop(&S,&x);
printf("出栈的元素为%d\n",x);
Pop(&S,&x);
printf("出栈的元素为%d\n",x);
if(GetTop(&S,&x) == 1){
printf("栈顶元素为%d\n",x);
}
printf("请输入待入栈的元素\n");
scanf("%d",&x);
Push(&S,x);
if(Empty(&S) == 1){
printf("栈为空\n");
}else{
printf("栈非空\n");
}
return 0;
}