顺序栈一些简单基本操作的实现,代码如下:
#include<stdio.h>
#include<stdbool.h>
#define MAXSIZE 20 /*存储空间初识分配量*/
typedef int SElemType;//定义SElemType表示int类型typedef
struct
{
SElemType data[MAXSIZE];
int top; //用于栈顶指针
}SqStack;
//初始化操作,建立一个空栈S
void InitStack(SqStack *S)
{
S->top = -1;
printf("初始化成功!\n");
}
//若栈存在,则销毁它 也就是将整个栈都释放掉
void DestroyStack(SqStack* S)
{
S->top;//如果栈是动态申请的(malloc),用free(S);
printf("销毁栈成功!\n");
}
//将栈清空
void ClearStack(SqStack* S)
{
S->top = -1;
printf("清空成功!\n");
}
//判断栈是否为空
void StackEmpty(SqStack* S)
{
if (S->top == -1)
{
printf("栈为空!\n");
}
else
{
printf("栈不为空!\n");
}
}
//若栈存在且非空,用e返回S的栈顶元素
bool GetTop(SqStack* S, SElemType* e)
{
if (S->top != -1)
{
*e = S->data[S->top];
return true;
}
else
{
return false;
}
}
//若栈S存在,插入新的元素e到栈S中并且成为栈顶元素
bool Push(SqStack* S, SElemType e)
{
if (S->top != -1)
{
S->data[++S->top] = e;
return true;
}
else
{
return false;
}
}
//删除栈S中栈顶元素,并且e返回其值
bool Pop(SqStack* S, SElemType* e)
{
if (S->top != -1)
{
*e = S->data[S->top];
S->top--;
return true;
}
else
{
return false;
}
}
//栈S的元素个数
void StackLength(SqStack* S)
{
if (S->top != -1)
{
printf("栈元素个数为%d个。\n",S->top+1);
}
else
{
printf("栈为空!\n");
}
return;
}
//遍历栈的所有元素
void Show(SqStack* S)
{
int i=0;
while (i<=S->top)
{
printf("%d,", S->data[i++]);
}
printf("\b;\n");
return;
}
int main()
{
//如果是指针访问数据成员或成员函数,用->,
//而如果是某个数据类型的对象访问自己的数据成员和成员函数,用.
SqStack Sq;
SElemType e;
SElemType ee = 99;
InitStack(&Sq);//初始化栈 并赋值
for (int i = 0; i < 10; ++i)
{
Sq.data[i] = i;
Sq.top++;
}
StackEmpty(&Sq);//判断栈是否为空
//删除栈顶元素
if (Pop(&Sq, &e))
{
printf("删除成功,栈顶元素为:%d\n", e);
}
else
{
printf("栈为空,无栈顶元素!\n");
}
Show(&Sq);
//输出栈顶元素
if (GetTop(&Sq, &e))
{
printf("栈顶元素为:%d\n", e);
}
else
{
printf("栈为空,无栈顶元素!\n");
}
Show(&Sq);
//插入元素
if (Push(&Sq, ee))
{
printf("插入成功!\n");
}
else
{
printf("插入失败!\n");
}
Show(&Sq);
//清空栈
ClearStack(&Sq);
Show(&Sq);
DestroyStack(&Sq);
return 0;
}
输出结果如下图所示: