本文只有代码,介绍了有关栈的基本操作。
已经过调试没有很大问题。
如有错误,还请批评指正。
一、栈的实现和表示:
#pragma once #define _CRT_SECURE_NO_WARNINGS #include#include #include typedef int SElemType; typedef int Status; #define STACK_INIT_SIZE 100//储存空间初始分配量 #define STACKINCREMENT 10 //储存空间分配增量 #define OK 1 #define ERROR 0 //栈的表示 typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack;
二、栈的基本操作:
//函数声明 Status InitStack(SqStack* S);//构造一个空栈InitStack(S) Status DestroyStack(SqStack* S);//销毁栈DestroyStack(S) Status ClearStack(SqStack* S);//把S置为空栈ClearStack(S) Status StackEmpty(SqStack* S);//判断是否为空栈StackEmpty(S) Status StackLength(SqStack* S);//返回S的元素个数,即栈的长度StackLength(S) Status GetTop(SqStack* S, SElemType* e);//返回栈顶元素GetTop(S, &e) Status Push(SqStack* S, SElemType e);//插入元素e为新的栈顶元素Push(S, e) Status Pop(SqStack* S, SElemType* e);//删除栈顶元素并用e返回其值Pop(S, &e) Status StackTraverse(SqStack* S);//遍历栈,输出其值StackTraverse(S)
1、构造一个空栈:
//构造一个空栈InitStack(S)
Status InitStack(SqStack* S)
{
// 分配初始空间
S->base = (SElemType*)malloc(sizeof(SElemType) * STACK_INIT_SIZE);
if (S->base)
{
S->stacksize = STACK_INIT_SIZE;//栈的最大长度等于初始长度
S->top = S->base;// 栈顶与栈底相同
}
else
{
return ERROR;
}
return OK;
}
2、销毁栈:
//销毁栈DestroyStack(S)
Status DestroyStack(SqStack* S)
{
free(S->base);
S->base = S->top = NULL;
S->stacksize = 0;
return OK;
}
3、把S置为空栈:
//把S置为空栈ClearStack(S)
Status ClearStack(SqStack* S)
{
S->top = S->base;
return OK;
}
4、判断是否为空栈:
//判断是否为空栈StackEmpty(S)
Status StackEmpty(SqStack* S)
{
if (S->top == S->base)
{
return OK;
}
return ERROR;
}
5、返回S的元素个数,即栈的长度:
//返回S的元素个数,即栈的长度StackLength(S)
Status StackLength(SqStack* S)
{
return S->top - S->base;
}
6、返回栈顶元素G:
//返回栈顶元素GetTop(S, &e)
Status GetTop(SqStack* S, SElemType* e)
{
if (S->top == S->base)
{
return ERROR;
}
*e = *(S->top - 1);
return OK;
}
7、插入元素e为新的栈顶元素:
//插入元素e为新的栈顶元素Push(S, e)
Status Push(SqStack* S, SElemType e)
{
if (S->top - S->base >= S->stacksize)//栈满
{
S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if (S->base)
{
// 栈顶指针为栈底指针加上栈之前的最大长度
S->top = S->base + S->stacksize;
// 栈当前的最大长度等于栈之前的最大长度与增加的长度之和
S->stacksize += STACKINCREMENT;
}
else
{
return ERROR;
}
}
*S->top++ = e;//先赋值,后栈顶指针上移
return OK;
}
8、删除栈顶元素并用e返回其值:
//删除栈顶元素并用e返回其值Pop(S, &e)
Status Pop(SqStack* S, SElemType* e)
{
if (S->top == S->base)
{
return ERROR;
}
*e = *--S->top; // 栈顶指针先下移,后赋值
return OK;
}
9、遍历栈,输出其值:
//遍历栈,输出其值StackTraverse(S)
Status StackTraverse(SqStack* S)
{
SElemType* p = S->base;
while (S->top > p)
{
printf("%d ", *p++);
}
printf("n");
return OK;
}
三、测试主程序 :
void menu()
{
printf("******************************************n");
printf("****** 1.创建空栈 2.销毁栈 ******n");
printf("****** 3.清空栈 4.判断是否为空 ******n");
printf("****** 5.求栈的长度 6.返回栈顶元素 ******n");
printf("****** 7.压栈 8.删除栈顶元素 ******n");
printf("****** 9.输出栈 0.退出 ******n");
printf("******************************************n");
}
int main()
{
SqStack q,* S;
S = &q;
SElemType e = 0;
int input = 1;
menu();
while (input)
{
printf("请输入要执行的操作:>");
scanf("%d", &input);
switch (input)
{
case 1:
if (InitStack(S))
{
printf("创建成功!!!n");
}
else
{
printf("创建失败~n");
}
break;
case 2:
if (DestroyStack(S))
{
printf("销毁成功!!!n");
}
else
{
printf("销毁失败~n");
}
break;
case 3:
if (ClearStack(S))
{
printf("栈已清空!n");
}
else
{
printf("清空失败~n");
}
break;
case 4:
if (StackEmpty(S))
{
printf("栈为空!!!n");
}
else
{
printf("栈不为空~n");
}
break;
case 5:
printf("栈的长度为:%dn", StackLength(S));
break;
case 6:
if (GetTop(S, &e))
{
printf("栈顶元素为:%dn", e);
}
else
{
printf("没有栈顶元素~n");
}
break;
case 7:
printf("请输入要插入的元素值:>");
scanf("%d", &e);
if (Push(S, e))
{
printf("元素插入成功!n");
}
else
{
printf("插入失败~n");
}
break;
case 8:
if (Pop(S, &e))
{
printf("栈顶元素删除成功n");
}
else
{
printf("栈为空,无法删除~n");
}
printf("删除的元素为:%dn", e);
break;
case 9:
printf("此时栈内元素为:");
StackTraverse(S);
break;
case 0:
printf("退出成功!!!n");
break;
default:
printf("输入错误,请重新输入!!!n");
break;
}
}
system("pause");
return 0;
}


