c语言数据结构栈操作
文章目录
前言
一、栈的基本概念
简单来说栈(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("栈顶元素:%d\n",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("栈顶元素为:%d\n",*(--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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#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("栈顶元素为:%d\n",*(--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;
}
运行结果