数据结构—栈与队列基本知识点在这篇博客中介绍了栈的基本知识点,现在我们用C将这些基本操作都实现一下。
InitStack(**S):初始化栈
CreateStack(*S):创建栈
LengthStack(*S):输出栈的元素个数
OutTop(*S):输出栈顶元素
Push(*S):入栈操作,将元素e插入到栈顶
Pop(*S,*e):出栈操作,删除栈顶元素,并返回其值
OutValue(*S):输出顺序栈各个元素
ClearStack(*S):清空顺序栈
StackEmpty(*S):顺序栈是否为空
代码如下所示(在执行其它功能之前,务必先执行1、2功能将顺序栈创建成功):
#include<cstdio>
#include<cstdlib>
#define OK 1
#define ERROR 0
#define MAXSIZE 1024
typedef int Status;
typedef int SElemType; //SElemtype 类型根据实际情况而定,这里假设为int
typedef struct SqStack
{
SElemType data[MAXSIZE];
int top; //用于栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack **S)
{
*S = (SqStack *)malloc(sizeof(SqStack));
if (S == NULL) //判断申请内存空间是否成功 失败值为NULL 成功反之
{
printf("申请内存空间失败,初始化失败!\n");
}
else
{
(*S)->top = -1;//将顺序栈的栈顶设为-1,表示栈为空栈
printf("初始化成功!\n");
}
}
//创建栈
void CreateStack(SqStack *S)
{
printf("请输入元素(输入最后一个元素后,请直接换行):");
for (int i = S->top+1; i < MAXSIZE; ++i)//i值小于数组最大长度MAXSIZE
{
scanf("%d", &S->data[i]);
S->top++;
if (getchar() == '\n')//条件成立说明元素都已经录入完毕,跳出循环,结束输入
{
break;
}
}
printf("创建完毕!\n");
}
//输出栈的元素个数
void LengthStack(SqStack *S)
{
if (S->top == -1)
{
printf("栈为空栈,元素个数为0\n");
}
else
{
printf("栈的元素个数为:%d\n", S->top + 1);
}
}
//输出栈顶元素
void OutTop(SqStack *S)
{
if (S->top == -1)
{
printf("栈为空栈,没有栈顶元素!\n");
}
else
{
printf("栈顶元素为:%d\n", S->data[S->top]);
}
}
//入栈操作
//插入元素e到栈顶
Status Push(SqStack *S, SElemType e)
{
if (S->top >= MAXSIZE - 1)
{
printf("栈已满,插入元素失败!\n");
return ERROR;
}
else
{
S->top++;
S->data[S->top] = e;
printf("插入元素成功!\n");
return OK;
}
}
//出栈操作pop
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
Status Pop(SqStack *S, SElemType *e)
{
if (S->top == -1)
{
printf("栈为空栈,没有栈顶元素可删除!\n");
return ERROR;
}
*e = S->data[S -> top]; //将要删除的栈顶元素赋值给e
S->top--; //栈顶指针减一
return OK;
}
//输出顺序栈各个元素
void OutValue(SqStack *S)
{
if (S->top != -1)
{
printf("栈中的各个元素为:");
for (int i = 0; i < S->top + 1; ++i)//从栈底元素开始输出
{
printf("%d ", S->data[i]);
}
printf("\n其中%d为栈顶元素\n", S->data[S->top]);
}
else
{
printf("栈为空栈,没有元素!\n");
}
}
//清空顺序栈
void ClearStack(SqStack *S)
{
if (S->top == -1)
{
printf("栈为空栈,请勿重复执行此操作!\n");
}
else
{
S->top = -1;
printf("清空栈成功!\n");
}
}
//顺序栈是否为空
bool StackEmpty(SqStack *S)
{
if (S->top == -1)
{
return true;
}
return false;
}
//菜单界面
void Menu()
{
system("cls"); //清空屏幕
printf("\n");
printf("\t\t-------------------欢迎使用顺序栈的基本操作----------------------\n");
printf("\t\t|\t\t 1 初始化顺序栈 \t\t|\n");
printf("\t\t|\t\t 2 建立顺序栈 \t\t|\n");
printf("\t\t|\t\t 3 输出顺序栈的元素个数 \t\t|\n");
printf("\t\t|\t\t 4 输出顺序栈栈顶元素 \t\t|\n");
printf("\t\t|\t\t 5 插入指定元素到栈顶 \t\t|\n");
printf("\t\t|\t\t 6 删除栈顶元素 \t\t|\n");
printf("\t\t|\t\t 7 输出顺序栈各个元素 \t\t|\n");
printf("\t\t|\t\t 8 清空顺序栈 \t\t|\n");
printf("\t\t|\t\t 9 顺序栈是否为空 \t\t|\n");
printf("\t\t|\t\t 10 退出系统 \t\t|\n");
printf("\t\t-----------------------------------------------------------------\n");
printf("\t\t请选择(1-10):");
}
int main()
{
SqStack *S;
int quit = 0;
int select;
SElemType e;
while (1)
{
Menu(); //调用菜单函数
scanf("%d", &select);
switch (select)
{
case 1: InitStack(&S); break; //初始化顺序栈
case 2: CreateStack(S); break; //建立顺序栈
case 3: LengthStack(S); break; //输出顺序栈的元素个数
case 4: OutTop(S); break; //输出顺序栈栈顶元素
case 5: //插入指定元素到栈顶
printf("要插入的元素的值为:");
scanf("%d", &e);
Push(S, e);
break;
case 6: //删除栈顶元素
if (Pop(S, &e))
{
printf("删除成功!\n删除的栈顶元素的值为:%d\n", e);
}
break;
case 7: OutValue(S); break; //输出顺序栈各个元素
case 8: ClearStack(S); break; //清空顺序栈
case 9: //顺序栈是否为空
if (StackEmpty(S))
{
printf("栈为空栈!\n");
}
else
{
printf("栈不为空!\n");
}
break;
case 10: quit = 1; break;//退出系统
default:printf("请输入1-10之间的数字\n"); break;
}
if (quit == 1)
{
break;
}
printf("按任意键返回主菜单!\n");
if (select != 2)
{
getchar(); //提取缓冲区中的回车键
}
getchar(); //起到暂停的作用
}
free(S);//释放S
printf("程序结束!\n");
return 0;
}
执行结果如下图所示: