//栈
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
#include <corecrt_math.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
#define STACKINCREMENT 10
typedef struct {
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
Status InitStack(SqStack& S) {
S.base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}//栈的初始化
Status Push(SqStack& S,SElemType e)
{
if (S.base == NULL) {
printf("请先初始化栈!");
return ERROR;
}
if (S.top - S.base >= S.stacksize)
{
S.base = (SElemType*)realloc(S.base, S.stacksize + STACKINCREMENT* sizeof(SElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}//入栈
Status Pop(SqStack& S, SElemType& e)
{
if (S.base == NULL) {
return ERROR;
}
if (S.top == S.base) return ERROR;
e = *--S.top;
printf("出栈成功");
return OK;
}//出栈
Status StackEmpty(SqStack S )
{ if(S.top == S.base||S.base==NULL)
return OK;
else return ERROR;
}
Status PrintStack(SqStack S)
{
if (S.base == NULL) {
printf("请先初始化栈!");
return ERROR;
}
SqStack p{};
if ((S.top == NULL) || (S.stacksize == 0))
{
printf("请先创建栈\n");
return ERROR;
}
p.base = S.base;
while (p.base!=S.top)
{
printf("%d ",*p.base++);
}
return OK;
}//打印栈
void OperateMenu1()
{
printf("\n........................\n");
printf("1.入栈元素 2.出栈元素\n");
printf("3.是否为空 4.打印栈 \n");
printf("5.栈的长度 6.栈顶元素\n");
printf("7.初始化栈 0.退出程序\n");
printf("........................\n");
printf("输入你想执行的操作:");
}
Status StackLength(SqStack S) {
if (S.base == NULL) {
printf("请先初始化栈!");
return ERROR;
}
SqStack p{};
int i = 0;
p.base = S.base;
while (p.base++ != S.top)
{
i++;
printf("栈长的长度为%d", i);
return i;
}
}//获取栈长
Status GetTop(SqStack S) {
if (S.base == NULL) {
printf("请先初始化栈!");
return ERROR;
}
if ((S.top == NULL) || (S.stacksize == 0))
{
printf("请先创建栈\n");
return ERROR;
}
return *(S.top-1);
}//获取栈顶元素
void main()
{
//定义程序所用的所有变量,包括栈 S;
//S.base = NULL;
//调用函数 InitStack();
//调用函数 OperateMenu();
//根据 OperateMenu 函数的返回值,应用 switch 语句分情况调用以下函数:
//{
//情况 0:退出;
//思考这条语句的作用?情况 1:调用函数 Push() , 并合理处理函数返回值 ;
//情况 2:调用函数 Pop() , 并合理处理函数返回值;
//情况 3:调用函数 StackEmpty(), 并合理处理函数返回值;
//情况 4:调用函数 PrintStack();
//其他情况:调用其他自定义函数(教材 55 页中自选) ,这些函数由大家自己完成;
SqStack S;
S.base = NULL;
int n = 0,a,s;
do {
OperateMenu1();
scanf("%d", &n);
switch (n) {
case 0:
printf("退出");
break;
case 1:
printf("输入你想进栈的元素:");
scanf("%d", &a);
Push(S,a);
break;
case 2:
Pop(S,a);
break;
case 3:
if (StackEmpty(S))
{
printf("该栈为空");
}
else
{
printf("该栈不为空");
}
break;
case 4:
PrintStack(S);
break;
case 5:
StackLength(S);
break;
case 6:
s = GetTop(S);
if (s == NULL) {
printf(" 栈顶为空!");
}
else if (S.base != NULL) {
printf("栈顶元素为:%d", s);
}
break;
case 7:
InitStack(S);
printf("初始化成功");
break;
default:
printf("请重新选择操作!");
break;
};
} while (n);
}
10-14
1万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)