一、栈的基本概念
栈是限定仅在表尾进行插入和删除操作的线性表,是特殊的线性表
栈顶(top)是允许插入和删除的一端,栈底(bottom)则是另一端
空栈:不含任何数据元素的栈
- 栈又称为后进先出的线性表(Last In First Out)简称LIFO结构
栈是一个线性表,具有线性关系,即前驱后继关系,在表尾中进行插入和删除操作时,这个 表尾指的是栈顶
- 栈的插入(push):叫作进栈、压栈、入栈
栈的删除(pop):叫作出栈、弹栈
空栈、进栈、出栈示意图
二、栈的结构定义
data
数组用于存储栈中的元素,而 top
则用于指示栈顶元素的位置。
在使用这个顺序栈时,可以进行入栈和出栈等操作,同时需要注意栈的大小不能超过 MAXSIZE
typedef int SElemType //假设SElemType的类型为int
//顺序栈结构
typedef struct
{
SElemType data[MAXSIZE];
int top; //用于栈顶指针
}SqStack;
三、进栈操作
用push函数,作用是将新元素插入到顺序栈的栈顶,如果栈已满则插入失败。
步骤:
-
if (S->top == MAXSIZE - 1)
:这个条件判断用于检查栈是否已满。如果栈顶指针top
等于MAXSIZE - 1
,说明栈已满,无法再插入新元素,此时返回ERROR
表示插入失败。 -
S->top++
:栈顶指针加一,表示新元素将插入到栈顶位置。 -
S->data[S->top] = *e
:将新插入的元素值e
赋值给栈顶空间。 -
return OK
:返回OK
表示插入操作成功。
// 插入元素为 e 的新栈顶元素
Status Push(SqStack *S, SElemType *e) {
// 判断栈是否已满
if (S->top == MAXSIZE - 1) {
return ERROR; // 栈满,插入失败
}
S->top++; // 栈顶指针加一
S->data[S->top] = *e; // 将新插入元素赋值给栈顶空间
return OK; // 插入成功
}
四、出栈操作
用pop函数,作用是删除顺序栈的栈顶元素,如果栈为空则删除失败。
步骤:
-
if (S->top == -1)
:这个条件判断用于检查栈是否为空。如果栈顶指针top
等于-1
,说明栈为空,无法执行删除操作,此时返回ERROR
表示删除失败。 -
*e = S->data[S->top]
:将要删除的栈顶元素的值赋值给e
,用于返回被删除元素的值。 -
S->top--
:栈顶指针减一,表示删除栈顶元素。 -
return OK
:返回OK
表示删除操作成功。
// 若栈不空,将删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERROR
Status Pop(SqStack *S, SElemType *e) {
if (S->top == -1)
return ERROR; // 栈空,删除失败
*e = S->data[S->top]; // 将要删除的栈顶元素赋值给 e
S->top--; // 栈顶指针减一
return OK; // 删除成功
}
五、根据图示写出进栈出栈的完整代码
文字描述:
1.空栈
2.A进栈
3.B进栈
4.C进栈
5.C出栈
6.B出栈
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5 // 定义栈的最大大小
typedef char SElemType; // 栈中元素类型为字符
typedef struct {
SElemType data[MAXSIZE];
int top; // 栈顶指针
} SqStack;
typedef enum {
OK,
ERROR,
} Status;
// 初始化栈
Status InitStack(SqStack *S) {
S->top = -1; // 空栈时栈顶指针置为-1
return OK;
}
// 进栈操作
Status Push(SqStack *S, SElemType e) {
if (S->top == MAXSIZE - 1) {
return ERROR; // 栈满,插入失败
}
S->top++;
S->data[S->top] = e;
return OK;
}
// 出栈操作
Status Pop(SqStack *S, SElemType *e) {
if (S->top == -1) {
return ERROR; // 栈空,删除失败
}
*e = S->data[S->top];
S->top--;
return OK;
}
int main() {
SqStack stack;
SElemType e;
// 第一步:初始化栈为空栈
InitStack(&stack);
// 第二步:A 进栈
Push(&stack, 'A');
// 第三步:插入元素 B 进栈
Push(&stack, 'B');
// 第四步:C 进栈
Push(&stack, 'C');
// 打印当前栈内容
printf("Current stack: ");
for (int i = 0; i <= stack.top; i++) {
printf("%c ", stack.data[i]);
}
printf("\n");
// 第五步:C 出栈
Pop(&stack, &e);
printf("Pop element: %c\n", e);
// 打印当前栈内容
printf("Current stack: ");
for (int i = 0; i <= stack.top; i++) {
printf("%c ", stack.data[i]);
}
printf("\n");
// 第六步:B 出栈
Pop(&stack, &e);
printf("Pop element: %c\n", e);
// 打印当前栈内容
printf("Current stack: ");
for (int i = 0; i <= stack.top; i++) {
printf("%c ", stack.data[i]);
}
printf("\n");
return 0;
}