要求:利用书本上的栈的顺序存储结构定义,
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
typedef struct {
SElemType *base; // base的初值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
} SqStack;
1)编写完成下列功能的函数:(1)初始化一个空栈;(2)随机创建一个包含正整数值的栈(当输入-1时创建结束);(3)将一个数x插在栈顶(x在程序运行时输入);(4)将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;(5)输出栈顶元素的值;(6)求栈的长度;(7)输出从栈底到栈顶的所有元素。
2)用主函数调用你所编写的函数,并在使栈有所变化的每一步输出栈从栈顶到栈底的所有元素,以验证你编程序的正确性。
备注:(1)要求编一菜单,根据选项逐个调用各函数;(2)所编程序要具有一定的健壮性,即:在插入删除时要考虑栈空、栈满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define SElemType int
typedef struct {
SElemType *base; // base的初值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
} SqStack;
// 初始化一个空栈
void InitStack(SqStack *S) {
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S->base) {
exit(1); // 分配失败
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
}
// 销毁栈
void DestroyStack(SqStack *S) {
free(S->base);
S->base = S->top = NULL;
S->stacksize = 0;
}
// 入栈
void Push(SqStack *S, SElemType x) {
if (S->top - S->base >= S->stacksize) {
// 栈满,需要扩容
S->base = (SElemType *)realloc(S->base, (S->stacksize + STACK_INIT_SIZE) * sizeof(SElemType));
if (!S->base) {
exit(1); // 内存分配失败
}
S->top = S->base + S->stacksize;
S->stacksize += STACK_INIT_SIZE;
}
*(S->top) = x;
S->top++;
}
// 出栈
SElemType Pop(SqStack *S) {
if (S->top == S->base) {
// 栈空,无法出栈
exit(1);
}
S->top--;
SElemType x = *(S->top);
return x;
}
// 获取栈顶元素
SElemType GetTop(SqStack *S) {
if (S->top == S->base) {
// 栈空,无栈顶元素
exit(1);
}
return *(S->top - 1);
}
// 获取栈的长度
int StackLength(SqStack *S) {
return S->top - S->base;
}
// 输出栈的所有元素
void PrintStack(SqStack *S) {
SElemType *p = S->base;
while (p < S->top) {
printf("%d ", *p);
p++;
}
printf("\n");
}
int main() {
SqStack S;
InitStack(&S);
int choice;
SElemType x;
do {
printf("\nMenu:\n");
printf("1. Push\n");
printf("2. Pop\n");
printf("3. Get Top\n");
printf("4. Stack Length\n");
printf("5. Print Stack\n");
printf("0. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter the element to push: ");
scanf("%d", &x);
Push(&S, x);
break;
case 2:
x = Pop(&S);
printf("Popped element: %d\n", x);
break;
case 3:
x = GetTop(&S);
printf("Top element: %d\n", x);
break;
case 4:
printf("Stack Length: %d\n", StackLength(&S));
break;
case 5:
printf("Stack Elements: ");
PrintStack(&S);
break;
case 0:
DestroyStack(&S);
break;
default:
printf("Invalid choice!\n");
break;
}
} while (choice != 0);
return 0;
}