数据结构——顺序栈的基本操作
顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到 栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。由于C语言中数组的下标是从0开始的,通常习惯的做法是:以top=-1 表示空栈。
顺序栈的定义如下:
#define MAXsize 100
#define ElementType int
typedef struct {
ElementType data[MAXsize];
int top;
}SeqStack;
顺序栈的初始算法
SeqStack* InitStack(SeqStack* s) { //生成空堆栈
s = (SeqStack*)malloc(sizeof(SeqStack));
if (s == NULL)
printf("申请失败\n");
else
s->top = -1;
return s;
}
判断栈是否满
int FullStack(SeqStack* s) { //判断栈是否满
if (s->top == MAXsize-1)
return 1;
else
return 0;
}
判断栈是否为空
int EmptyStack(SeqStack* s) { //判断栈为空
if (s->top == -1)
return 1;
else
return 0;
}
删除一个栈顶元素
ElementType Pop(SeqStack* s,ElementType *e) { //在栈顶删除一个元素
if (EmptyStack(s) == 1) {
printf("栈为空,无法删除\n");
return 0;
}
else {
*e = s->data[s->top];
s->top--;
return 1;
}
}
在栈顶添加一个元素
void Push(SeqStack* s, ElementType x) { //在栈顶插入一个元素
if (FullStack(s) == 1)
printf("栈已经满,无法插入\n");
else{
s->top++;
s->data[s->top] = x;
printf("加入栈成功\n");
}
}
完整代码如下
#include <stdlib.h>
#include <stdio.h>
#define MAXsize 100
#define ElementType int
typedef struct {
ElementType data[MAXsize];
int top;
}SeqStack;
SeqStack* InitStack(SeqStack* s) { //生成空堆栈
s = (SeqStack*)malloc(sizeof(SeqStack));
if (s == NULL)
printf("申请失败\n");
else
s->top = -1;
return s;
}
int FullStack(SeqStack* s) { //判断栈是否满
if (s->top == MAXsize-1)
return 1;
else
return 0;
}
void Push(SeqStack* s, ElementType x) { //在栈顶插入一个元素
if (FullStack(s) == 1)
printf("栈已经满,无法插入\n");
else{
s->top++;
s->data[s->top] = x;
printf("加入栈成功\n");
}
}
int EmptyStack(SeqStack* s) { //判断栈为空
if (s->top == -1)
return 1;
else
return 0;
}
ElementType Pop(SeqStack* s,ElementType *e) { //在栈顶删除一个元素
if (EmptyStack(s) == 1) {
printf("栈为空,无法删除\n");
return 0;
}
else {
*e = s->data[s->top];
s->top--;
return 1;
}
}
int main() {
ElementType selector,x,k;
int i,n,m;
SeqStack* s;
s = (SeqStack*)malloc(sizeof(SeqStack));
printf("请输入要为栈添加多少个元素:");
scanf("%d",& n);
if (n > 100) {
printf("添加的元素太多,请少于101,从新输入:");
scanf("%d", &n);
}
else {
printf("输入要添加的元素:");
for (i = 0;i < n;i++) {
scanf("%d", &s->data[i]);
}
s->top = n - 1;
do {
printf("1.创建栈\n");
printf("2.判断栈是否为空\n");
printf("3.判断栈是否满\n");
printf("4.在栈顶删除一个元素\n");
printf("5.在栈顶插入一个元素\n");
printf("0.退出\n");
printf("请输入你的选择:");
scanf("%d", &selector);
switch (selector) {
case 1:
InitStack(s);
break;
case 2:
m = EmptyStack(s);
if (m == 1)
printf("该栈为空\n");
else
printf("该栈不为空\n");
break;
case 3:
m= FullStack(s);
if (m == 1)
printf("栈满\n");
else
printf("栈未满\n");
break;
case 4:
Pop(s,&k);
break;
case 5:
printf("输入要添加的元素:");
scanf("%d", &x);
Push(s,x);
break;
default:
printf("选择错误\n");
}
} while (selector != 0);
}
return 0;
}