#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
typedef int Status;
typedef int SElemType;
typedef struct
{
SElemType *base; // 栈底指针
SElemType *top; // 栈顶指针
int stacksize; // 栈当前可用最大容量
} SqStack;
Status InitStack(SqStack *S) // 栈的初始化
{
S->base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
if (!S->base)
exit(ERROR);
S->top = S->base;
S->stacksize = MAXSIZE;
return OK;
}
Status IsEmpty(SqStack *S) // 判断栈是否空
{
return S->top == S->base;
}
Status IsFull(SqStack *S) // 判断栈是否满
{
return S->top - S->base >= S->stacksize;
}
Status Push(SqStack *S, SElemType e) // 元素入栈
{
if (IsFull(S))
{
S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S->base)
return ERROR;
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top++) = e;
return OK;
}
Status Pop(SqStack *S, SElemType *e) // 栈顶元素出栈
{
if (IsEmpty(S))
return ERROR;
*e = *(S->top - 1);
S->top--;
return OK;
}
Status GetTop(SqStack *S, SElemType *e) // 获得栈顶元素
{
if (S->top != S->base)
{
*e = *(S->top - 1);
return OK;
}
else
{
return ERROR;
}
}
void Menu()
{
printf("------- 顺序栈操作菜单 -------\n");
printf("1. 判断栈是否空\n");
printf("2. 判断栈是否满\n");
printf("3. 元素入栈\n");
printf("4. 元素出栈\n");
printf("5. 取栈顶元素\n");
printf("0. 退出\n");
printf("---------------------------\n");
printf("请选择操作:");
}
int main()
{
SqStack S;
SElemType e = 0;
int x;
InitStack(&S);
do
{
Menu();
scanf("%d", &x);
switch (x)
{
case 1:
if (IsEmpty(&S))
{
printf("栈为空.\n");
}
else
{
printf("栈不空.\n");
}
break;
case 2:
if (IsFull(&S))
{
printf("栈已经满了.\n");
}
else
{
printf("栈还没满.\n");
}
break;
case 3:
printf("请输入需要入栈的元素:\n");
scanf("\n%c", &e);
if (Push(&S, e))
{
printf("入栈成功.\n");
}
else
{
printf("入栈失败.\n");
}
break;
case 4:
if (Pop(&S, &e))
{
printf("出栈的元素: %c\n", e);
}
else
{
printf("出栈失败.\n");
}
break;
case 5:
if (GetTop(&S, &e))
{
printf("栈顶元素为: %c\n", e);
}
else
{
printf("栈顶没有元素\n");
}
break;
case 0:
printf("程序已退出.\n");
break;
}
} while (x != 0);
return 0;
}
注意事项:
这是一个基于C语言实现的顺序栈程序,通过调用不同的函数实现了顺序栈的初始化、判空、判满、入栈、出栈和取栈顶元素等操作。代码中使用了动态内存分配和realloc函数来动态扩展栈的存储空间,使得栈能够动态地调整大小。
此外,代码中还提供了一个简单的操作菜单,让用户可以选择对栈进行不同的操作。用户可以选择判断栈是否空、判断栈是否满、元素入栈、元素出栈、取栈顶元素和退出等选项,根据用户的选择调用相应的栈操作函数。
需要注意的是,代码中使用了字符类型的元素来进行栈的操作,即SElemType类型为char。在菜单中,用户可以输入字符来进行入栈操作,并且在出栈和取栈顶元素时显示相应的字符。如果需要修改为其他数据类型的栈,可以相应地修改SElemType的类型定义,并修改输入输出格式及函数参数类型。
运行结果:
这是一个使用C语言实现的顺序栈程序,它实现了顺序栈的初始化、判空、判满、入栈、出栈和取栈顶元素等操作。
首先定义了栈的数据结构类型SqStack,并定义了栈中元素的类型SElemType和操作状态类型Status;然后实现了初始化栈InitStack函数,用于初始化一个顺序栈;接下来分别实现了判断栈空IsEmpty、判断栈满IsFull、元素入栈Push、元素出栈Pop、取栈顶元素GetTop等操作函数;Menu函数用于显示操作菜单,包括判断栈是否空、判断栈是否满、元素入栈、元素出栈、取栈顶元素和退出等选项。
main函数中创建了一个顺序栈对象S,然后通过循环菜单的方式让用户选择对栈的操作,包括判断栈是否空、判断栈是否满、元素入栈、元素出栈、取栈顶元素和退出等选项。
整体来说,这段代码实现了一个顺序栈的基本操作,并通过菜单的形式提供给用户使用。在输入菜单选项后,会根据用户的选择调用相应的栈操作函数,对顺序栈进行操作并输出相应的结果。