编译软件为vs2022
数据结构为顺序栈
代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define MAXSIZE 100 // 栈的初始大小
#define INCREMENT 10 //增量大小
typedef int SElemType; // 栈元素的类型
typedef int Status; // 函数返回值的类型
typedef struct {
int* base; // 指向栈底的指针
int* top; // 指向栈顶的指针
int stacksize; // 当前栈的最大容量
} SqStack;
void printStack(SqStack* S);//遍历打印
int Isempty(SqStack* S);//判断栈空
void InitStack(SqStack* S)// 构造一个空栈
{
S->base = (int*)malloc(MAXSIZE * sizeof(int));
if (!S->base) {
printf("内存分配失败\n");
exit(0); // 内存分配失败,退出程序
}
else
printf("内存分配成功\n");
S->top = S->base;//头尾相等
S->stacksize = MAXSIZE;
}
void push(SqStack* S)//入栈
{
int n = 0;
printf("请输入插入的元素个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)//多次输入元素,每次检验一边是否超出界限
{
int e = 0;
printf("请输入第 %d 个元素:", i + 1);
scanf("%d", &e);
if ((S->top) - (S->base) >= S->stacksize)
{
S->base = (int*)realloc(S->base, S->stacksize + INCREMENT * sizeof(int));
//增加10个int类型的空间
if (!S->base)//栈底为空初始化失败
{
printf("扩容失败\n");
exit(0);
}
S->top = S->base + S->stacksize;//上移栈顶
S->stacksize += INCREMENT;//扩容
}
*(S->top) = e;//把栈顶指针取值后赋值e
S->top++;//上移栈顶
}
printStack(S);
}
void printStack(SqStack* S)//遍历栈
{
int x = 0;
x=Isempty(S);
if (x == 1) //返回值为1,判断为空
{
printf("栈为空\n");
exit(0);
}
printf("栈的元素为");
for (int* p = S->base; p < S->top; p++) {
printf("%d ", *p);
}
printf("\n");
}
void Pop(SqStack* S)//出栈 删除栈顶
{
if (S->top == S->base)
{
printf("栈空\n");
exit(0);
}
int e = 0;
e = *--S->top;
printf("出栈的元素为:%d\n", e);
printStack(S);
}
int Isempty(SqStack* S)//判空操作
{
int x;
if (S->base == S->top)
{
x = 1;//栈空为1
}
else
{
x = 0;//栈非空为0;
}
return x;
}
void Clearstack(SqStack* S)
{
int x;
x = Isempty(S);
if (x == 1)
{
printf("栈为空,无法销毁\n");
exit(0);
}
S->top = S->base;
printf("栈已销毁\n");
}
void Lengthstack(SqStack* S)
{
int x;
x = Isempty(S);
if (x == 1)
{
printf("栈为空,栈长为0\n");
exit(0);
}
else
{
int length;
length = S->top - S->base;
printf("栈的长度为%d\n", length);
}
}
void Getelement(SqStack* S) //查找元素位置
{
if (Isempty(S)) {
printf("栈为空,无法查找元素\n");
return;
}
int element;
printf("请输入查找的元素\n");
scanf("%d", &element);
int* p = S->top - 1;
int flag =S->top-S->base;
while (p >= S->base) {
if (*p == element) {
printf("%d的位置为%d", element, flag);
exit(0);
}
p--;
flag--;
}
printf("栈中不存在该元素\n");
}
int OperateMenu(SqStack * S) {
int choice;
char a[10];
int flag;
do {
printf("**************************************************************\n");
printf("请选择操作:\n");
printf("0、退出\n");
printf("1、入栈\n");
printf("2、出栈并删除栈顶\n");
printf("3、遍历打印栈\n");
printf("4、判断栈是否为空\n");
printf("5、销毁栈\n");
printf("6、求栈长\n");
printf("7、查找元素位置\n");
printf("**************************************************************\n");
printf("请输入操作");
scanf("%d", &choice);
switch (choice) {
case 0:
exit(0);
break;
case 1:
push(S);
break;
case 2:
Pop(S);
break;
case 3:
printStack(S);
break;
case 4:
flag=Isempty(S);
if (flag == 1)
printf("栈为空\n");
else
printf("栈非空\n");
break;
case 5:
Clearstack(S);
break;
case 6:
Lengthstack(S);
break;
case 7:
Getelement(S);
break;
}
printf("是否要继续进行操作\n");
printf("请输入YES or NO\n");
scanf("%s", a);
if (strcmp(a, "yes") == 0 || strcmp(a, "Yes") == 0 || strcmp(a, "YES") == 0) {
printf("好的!\n");
}
else if (strcmp(a, "no") == 0 || strcmp(a, "No") == 0 || strcmp(a, "NO") == 0) {
exit(0);
}
else {
break;
}
} while (choice != 0);
}
int main()
{
SqStack S;
S.base = NULL;
InitStack(&S);
//push(&S);
OperateMenu(&S);
return 0;
}