这里使用C++环境:目的使用&引用符,除此以外是C语言代码
#define _CRT_SECURE_NO_WARNINGS 1
#define MAXSIZE 100//存储空间初始化分配量
#define STACKINCREMENT 10//存储空间分配增量
#define ERROR 1
#define OVERFLOW 0
#define OK -2
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef int Status;
typedef struct {
SElemType* base;//在栈构造之前和销毁之后,值为NULL
SElemType* top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
Status InitStack(SqStack& S) //建立空栈 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) {
//插入元素e为栈顶元素
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){
//删除S的栈顶元素,用e返回值,返回OK
if (S.top == S.base) {
return ERROR;
}//空栈
e = *(--S.top);
return OK;
}
Status StackEmpty(SqStack &S){
//判断是否为空栈
if (S.top == S.base) {
return OK;
}
else {
return ERROR;
}
}
Status PrintStack(SqStack S) {
//打印栈中元素
int a=StackEmpty(S);
if (a > 0) {//不是空栈
while (S.top!=S.base) {
int e = *(--S.top);
printf("%d\n", e);
}
}
else if (a < 0) {
printf("这是个空栈\n");
}
return OK;
}
void OperateMenu() {
printf("0.:退出,1.:插入,2.:删除,3.:判断是否为空栈,4.:打印,5.:清空栈,6.:栈的长度\n");
}
void ClearStack(SqStack& S) {
//清空栈
while (S.top != S.base) {
int e = 0;
int a = Pop(S, e);
}
}
int LengthStack(SqStack S) {
//栈的长度
int a = StackEmpty(S);
int i = 0;
if (a > 0) {//不是空栈
while (S.top != S.base) {
int e = *(--S.top);
i++;
}
}
else if (a < 0) {
printf("这是个空栈\n");
}
printf("栈长度为:%d\n", i);
return i;
}
int main() {
SqStack S;
S.base = S.top = NULL;
int a = InitStack(S);
OperateMenu();
printf("请选择功能:\n");
int e;
int c;
while (1) {
scanf("%d", &a);
switch (a){
case 0:return 0;
case 1:
printf("请输入要插入栈顶的元素\n");
scanf("%d", &e);
Push(S, e);
OperateMenu();
break;
case 2:
Pop(S, e);
OperateMenu();
break;
case 3:
c=StackEmpty(S);
if (c == OK) {
printf("空栈\n");
}
else {
printf("不是空栈\n");
}
OperateMenu();
break;
case 4:
PrintStack(S);
OperateMenu();
break;
case 5: ClearStack(S);
OperateMenu();
break;
case 6:
LengthStack(S);
OperateMenu();
break;
default:
printf("输入有误,请重新输入\n:");
OperateMenu();
break;
}
}
}