- c语言数据结构栈操作
- 前言
- 一、栈的基本概念
- 二、栈的基本操作
- 三、栈的顺序存储结构
- 3.1 栈的初始化
- 3.2 栈为空判断
- 3.3 入栈Push
- 3.4 出栈Pop
- 3.5 获取栈顶元素
- 四、栈的共享实现
- 4.1 栈的初始化
- 4.2 入栈Push
- 4.3 出栈
- 4.4 栈顶元素获取
- 4.5 判断栈是否为满栈
- 4.6 判断栈是否为空栈
- 五、 总体代码
前言 一、栈的基本概念
二、栈的基本操作简单来说栈(Stack)就是只允许在一段进行插入或删除的线性表
重要术语:栈顶、栈低、空栈
栈的特点:后进先出(LIFO)
三、栈的顺序存储结构1)InitStack(&stack);初始化栈,构造一个空栈stack,分配内存空间
2) DestroyStack(&Stack);销毁栈,销毁并释放栈stack所占用空间
3) Push(&stack,&x);进栈,若栈未满,则将x元素加入成为新栈顶
4)Pop(&stack,&x);出栈,若栈非空,则弹出栈顶元素,并返回X
5)GetTop(&stack,&x);读栈顶元素,若栈stack非空,则用x返回栈顶元素
6) StackEmpty(&stack);判断一个stack栈是否为空
#define MAXSize 10 //定义栈的最大值
typedef struct Stack
{
int data[MAXSize]; //栈元素
int top; //栈指针
}SqStack;
3.1 栈的初始化
//栈初始化
void InitStack(SqStack *s)
{
s->top = -1; //初始化栈指针
}
3.2 栈为空判断
//栈为空判断
int StacEmptyk(SqStack *s)
{
if(s->top == -1)
{
return 0; //栈为空
}
return 1; //栈不为空
}
3.3 入栈Push
//进栈
int Push(SqStack *s,int dat)
{
if(s->top == MAXSize-1) //栈满了
{
return 0;
}
s->top = s->top +1; //指针先加1
s->data[s->top] = dat; //赋值
return 1;
}
3.4 出栈Pop
//出栈
int Pop(SqStack *s,int *dat)
{
if(s->top == -1) //栈空
{
return 0;
}
else{
*dat = s->data[s->top];
s->top--; //指针减一
}
return *dat;
}
3.5 获取栈顶元素
//获取栈顶元素
void GetTop(SqStack *s)
{
if(s->top == -1)
{
printf("栈为空n");
}
else{
printf("栈顶元素:%dn",s->data[s->top]);
}
}
四、栈的共享实现
typedef struct{
SDataType *base; //栈底指针
SDataType *top; //栈顶指针
int StackSize; //当前已经分配的存储空间,以元素为单位
}SqStack;
4.1 栈的初始化
这里使用top和base两个指针来标记栈顶和栈低的位置,最开始时两个指针都指向栈低
Status InitStack(SqStack *S)
{
S->base = (Element *)malloc(sizeof(Element) *MAX_Stack);
if(NULL == S->base)
{
printf("栈初始化失败n");
return -1;
}
//S->top始终指向栈顶元素的下一个位置
S->top = S->base; //初始化下状态为空
S->StackSize = MAX_Stack; //初始化当前栈的最大容量
return 1;
}
4.2 入栈Push
//入栈
Status Push(SqStack *S,DataType x)
{
DataType *p;
//首先判断栈是否满的(上溢出)
if(S->top - S->base == S->StackSize)
{
//追加空间
p = (Element *)realloc(S->base,(MAX_Stack+ADD_Stack * sizeof(Element)));
if(NULL == p)
{
printf("追加失败n");
return -1;
}
//成功找到则使s->base指向p
S->base = p;
S->top = S->base + S->StackSize;
S->StackSize += ADD_Stack;
}
//先插入元素,然后栈顶指针加1
*(S->top) = x;
S->top++;
return 1;
}
4.3 出栈
//出栈
Status Pop(SqStack *S,DataType *x)
{
//判断是否会发生下溢
if(S->top != S->base)
{
S->top--; //先把栈顶指针减1
*x = *(S->top);
}
else{
return -1;
}
return *x;
}
4.4 栈顶元素获取
//获取栈顶元素
void GetTop(SqStack *s)
{
if(s->top != s->base)
{
printf("栈顶元素为:%dn",*(--s->top));
s->top++; //获取栈顶元素后再将栈指针移回去不然打印时会少一个
}
else{
printf("栈空n");
}
}
4.5 判断栈是否为满栈
//判断是否为满栈
void IsFullStack(SqStack *s)
{
if(s->top - s->base == s->StackSize)
{
printf("栈满n");
}
else{
printf("栈未满n");
}
}
4.6 判断栈是否为空栈
//判断是否为空栈
void IsEmptyStack(SqStack *s)
{
if(s->top == s->base)
{
printf("栈空n");
}
else{
printf("栈非空n");
}
}
五、 总体代码
#include#include #include #define MAX_Stack 100 //默认最大容量 #define ADD_Stack 20 //追加容量 typedef int Element; typedef int DataType; typedef int Status; typedef struct Stack { Element *top; //栈顶指针 Element *base; //栈低指针 int StackSize; //栈的空间 }SqStack; Status InitStack(SqStack *S) { S->base = (Element *)malloc(sizeof(Element) *MAX_Stack); if(NULL == S->base) { printf("栈初始化失败n"); return -1; } //S->top始终指向栈顶元素的下一个位置 S->top = S->base; //初始化下状态为空 S->StackSize = MAX_Stack; //初始化当前栈的最大容量 return 1; } //入栈 Status Push(SqStack *S,DataType x) { DataType *p; //首先判断栈是否满的(上溢出) if(S->top - S->base == S->StackSize) { //追加空间 p = (Element *)realloc(S->base,(MAX_Stack+ADD_Stack * sizeof(Element))); if(NULL == p) { printf("追加失败n"); return -1; } //成功找到则使s->base指向p S->base = p; S->top = S->base + S->StackSize; S->StackSize += ADD_Stack; } //先插入元素,然后栈顶指针加1 *(S->top) = x; S->top++; return 1; } //出栈 Status Pop(SqStack *S,DataType *x) { //判断是否会发生下溢 if(S->top != S->base) { S->top--; //先把栈顶指针减1 *x = *(S->top); } else{ return -1; } return *x; } //栈元素打印 void PrintStack(SqStack *s) { while(s->top != s->base) { s->top--; printf("%d ",*(s->top)); } printf("n"); } //获取栈顶元素 void GetTop(SqStack *s) { if(s->top != s->base) { printf("栈顶元素为:%dn",*(--s->top)); s->top++; //获取栈顶元素后再将栈指针移回去不然打印时会少一个 } else{ printf("栈空n"); } } //判断是否为满栈 void IsFullStack(SqStack *s) { if(s->top - s->base == s->StackSize) { printf("栈满n"); } else{ printf("栈未满n"); } } //判断是否为空栈 void IsEmptyStack(SqStack *s) { if(s->top == s->base) { printf("栈空n"); } else{ printf("栈非空n"); } } int main(void) { int i = 0; SqStack stack; DataType x; InitStack(&stack); for(i = 1;i<=5;i++) { Push(&stack,i); } GetTop(&stack); //PrintStack(&stack); IsFullStack(&stack); IsEmptyStack(&stack); while(stack.top != stack.base) { Pop(&stack,&x); //出栈元素 printf("%d ",x); } printf("n"); return 0; }
运行结果



