栈
定义:
抽象数据类型:
栈的顺序存储结构、共享栈的顺序存储结构、栈的链式存储结构
a.栈的顺序存储结构源码
#include <stdio.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
typedef struct
{
SElemType data[MAXSIZE];
int top; //栈顶的游标
}SqStack;
Status Push(SqStack *stHead);
Status Pop(SqStack *stHead);
void showMainFun(SqStack *stHead);
Status Push(SqStack *stHead)
{
int flag = 1,count1=0,count2;
SElemType element;
SqStack *point = stHead;
while(flag)
{
if(point->top == (MAXSIZE-1))
{
puts("此栈以满!");
return ERROR;
}else
{
puts("请输入你要压入的元素值:");
scanf("%d",&element);
point->top++; //栈顶游标向上移一个单位
point->data[point->top] = element; //将元素值压入栈
count1++; //此次压栈统计
}
puts("是否继续压栈? 1.是 0.否");
scanf("%d",&flag);
}
count2 = point->top; //栈内总数统计
count2++;
printf("\n此次压栈数为:%d,栈内总数为:%d\n",count1,count2);
return OK;
}
Status Pop(SqStack *stHead)
{
int flag = 1;
SElemType element;
SqStack *point = stHead;
while(flag)
{
if(point->top == -1) //栈判空
{
puts("此栈已为空!");
return ERROR;
}else if(point->top == 0) //栈内只剩一个元素
{
printf("栈顶元素为:%d\n",point->data[point->top]);
point->top--;
return OK; //弹栈自动结束
}else //普通情况
{
printf("栈顶元素为:%d\n",point->data[point->top]);
point->top--;
}
puts("是否继续弹栈? 1.是 0.否");
scanf("%d",&flag);
}
return OK;
}
void showMainFun(SqStack *stHead)
{
int select,flag = 1;
SqStack *point = stHead;
while(flag)
{
puts("\t\t\t\t 1.压栈 \t\t\t\t");
puts("\t\t\t\t 2.弹栈 \t\t\t\t");
puts("\t\t\t\t 0.退出 \t\t\t\t");
scanf("%d",&select);
switch(select)
{
case 1: Push(point);break;
case 2: Pop(point);break;
case 0: flag = 0;break;
}
}
}
int main()
{
SqStack st; //创建一个栈
st.top = -1; //栈顶游标指向 -1,此时栈内没有数值
SqStack *stPoint = &st;
showMainFun(stPoint);
// Push(stPoint);
// Pop(stPoint);
}
b.共享栈的顺序存储结构源码
#include <stdio.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
typedef struct
{
SElemType data[MAXSIZE];
int top1; //1号栈的栈顶游标
int top2; //2号栈的栈顶游标
}SqDoubleStack; //此结构体类型名
Status Push(SqDoubleStack *stHead, int stackNumber);
Status Pop(SqDoubleStack *stHead, int stackNumber);
void showMainFun(SqDoubleStack *stHead);
Status Push(SqDoubleStack *stHead, int stackNumber)
{
int flag = 1;
SqDoubleStack *point = stHead;
SElemType element;
while(flag)
{
if((point->top1+1) == (point->top2)) //判断此栈是否已满
{
puts("此栈已满!");
return ERROR;
}else if(stackNumber == 1) //压1号栈
{
puts("请输入你要压栈的元素值:");
scanf("%d",&element);
point->top1++;
point->data[point->top1] = element;
}else //压2号栈
{
puts("请输入你要压栈的元素值:");
scanf("%d",&element);
point->top2--;
point->data[point->top2] = element;
}
puts("是否继续压栈? 1.是 0.否");
scanf("%d",&flag);
}
}
Status Pop(SqDoubleStack *stHead, int stackNumber)
{
int flag = 1;
SqDoubleStack *point = stHead;
SElemType element;
if(stackNumber == 1) // 判断弹1号栈
{
while(flag)
{
if(point->top1 == -1)
{
puts("此栈已为空!");
return ERROR;
}else if(point->top1 == 0)
{
printf("栈顶元素为:%d\n",point->data[point->top1]);
point->top1--;
return OK;
}else
{
printf("栈顶元素为:%d\n",point->data[point->top1]);
point->top1--;
}
puts("是否继续弹此栈(1号栈)? 1.是 0.否");
scanf("%d",&flag);
}
return OK;
}else //判断弹2号栈
{
while(flag)
{
if(point->top2 == MAXSIZE)
{
puts("此栈已为空!");
return ERROR;
}else if(point->top2 == (MAXSIZE-1))
{
printf("栈顶元素为:%d\n",point->data[point->top2]);
point->top2++;
return OK;
}else
{
printf("栈顶元素为:%d\n",point->data[point->top2]);
point->top2++;
}
puts("是否继续弹此栈(2号栈)? 1.是 0.否");
scanf("%d",&flag);
}
return OK;
}
}
void showMainFun(SqDoubleStack *stHead)
{
int select,flag = 1;
SqDoubleStack *point = stHead;
while(flag)
{
puts("\t\t\t\t 1.压栈(1号栈) \t\t\t\t");
puts("\t\t\t\t 2.压栈(2号栈) \t\t\t\t");
puts("\t\t\t\t 3.弹栈(1号栈) \t\t\t\t");
puts("\t\t\t\t 4.弹栈(2号栈) \t\t\t\t");
puts("\t\t\t\t 0.退出 \t\t\t\t");
scanf("%d",&select);
switch(select)
{
case 1: Push(point, 1);break;
case 2: Push(point, 2);break;
case 3: Pop(point, 1);break;
case 4: Pop(point, 2);break;
case 0: flag = 0;break;
}
}
}
int main()
{
SqDoubleStack dst; //创建一个栈
dst.top1 = -1; //1号栈栈顶游标为-1
dst.top2 = MAXSIZE; //2号栈栈顶游标为MAXSIZE
SqDoubleStack *dstPoint = &dst;
showMainFun(dstPoint);
}
c.栈的链式存储结构源码
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
typedef struct StackNode //链栈每个栈元素结点结构体
{
SElemType data; //结点数据
struct StackNode *next; //结点指针
}StackNode,*LinkStackPtr;
typedef struct LinkStack //栈顶标志结构体
{
LinkStackPtr top; //定义一个栈元素结点的指针
// StackNode *top; //与上一句功能一样
int count; //统计栈元素个数
}LinkStack;
Status linkListPush(LinkStack *point);
Status linkListPop(LinkStack *point);
void showMainFun(LinkStack *point);
Status linkListPush(LinkStack *point) //压栈
{
int flag = 1;
SElemType e;
LinkStackPtr pNew; //定义一个栈元素结点类型指针;
while(flag)
{
pNew = (LinkStackPtr)malloc(sizeof(StackNode)); //为栈元素结点开辟内存空间
puts("请输入压栈的元素值:");
scanf("%d",&e);
if(point->count == 0) //栈为空第一次压栈的情况
{
pNew->next = NULL; //将第一个栈元素的指针域置空;
pNew->data = e; //将第一个栈元素的数据域赋值
point->top = pNew; //将第一个栈元素的首地址赋给 栈顶结构体 中标志栈顶的指针
point->count++; //栈元素加 1
}else
{
pNew->data = e; //将第一个栈元素的数据域赋值
pNew->next = point->top; //将之前的栈顶元素 栈顶指针 赋给现在的 栈元素结点指针域,使之链接起来
point->top = pNew; //将现在栈元素的首地址赋给 栈顶结构体 中标志栈顶的指针
point->count++; //栈元素加 1
}
puts("压栈成功!");
puts("是够继续压栈? 1.是 0.否");
scanf("%d",&flag);
}
}
Status linkListPop(LinkStack *point) //出栈
{
int flag = 1;
LinkStackPtr pCurrent;
while(flag)
{
if(point->count == 0) //栈为空
{
puts("此栈已为空!");
return ERROR;
}
else if(point->top->next == NULL) //最后一个弹出栈的情况
{
printf("弹出的栈顶元素为:%d\n",point->top->data);
puts("此栈已为空!");
pCurrent = point->top;//为释放栈元素做准备
point->top = NULL; //栈顶结构体 中标志栈顶的指针置空
point->count = 0; //栈顶结构体 中栈元素统计置 0
free(pCurrent); //释放栈元素占用的内存空间
return OK; //弹栈自动结束
}else if(point->top == NULL)//栈本来就为空,没有入栈的情况
{
puts("此栈已为空!");
}else
{
printf("弹出的栈顶元素为:%d\n",point->top->data);
pCurrent = point->top; //为释放栈元素做准备
point->top = point->top->next; //栈元素结点的下一栈元素首地址赋给 栈顶结构体 中标志栈顶的指针
point->count--; //栈元素个数建 1
free(pCurrent); //释放栈元素占用的内存空间
}
puts("弹栈成功!");
puts("是够继续弹栈? 1.是 0.否");
scanf("%d",&flag);
}
}
void showMainFun(LinkStack *point)
{
int select,flag = 1;
while(flag)
{
puts("\t\t\t\t 1.压栈 \t\t\t\t");
puts("\t\t\t\t 2.弹栈 \t\t\t\t");
puts("\t\t\t\t 0.退出 \t\t\t\t");
scanf("%d",&select);
switch(select)
{
case 1: linkListPush(point);break;
case 2: linkListPop(point);break;
case 0: flag = 0;break;
}
}
}
int main()
{
LinkStack test,*point; //定义一个 栈顶标志结构体 变量 和此类型指针
test.count = 0; //栈顶标志结构体 变量 计数置0
test.top = NULL; //栈顶标志结构体 变量 标志栈顶指针置空
point = &test; //栈顶标志结构体 变量 的首地址赋给 栈顶标志结构体指针
showMainFun(point);
return 0;
}