1.栈
栈是一种只允许在一端插入和删除操作,元素先进后出的受限线性表
2.常用操作
- initStack :初始化一个空栈
- Pop:若栈未空,元素出栈
- Push:若栈未满,元素进栈
- getTopEle:获取栈顶元素
- isEmpty: 判断此时栈是否为空
3.栈的实现
3.1栈的顺序存储结构
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//定义最大容量为4
#define MaxSize 4
typedef struct Stack {
int data[MaxSize];
int top;
}SqStack;
void initSqStack(SqStack &S) {
S.top = -1;
}
//判断栈S是否为空
bool isEmpty(SqStack S) {
if (S.top == -1) {
return true;
}
return false;
}
//判断栈是否为满
bool isFull(SqStack S) {
if (S.top = MaxSize-1) {
return false;
}
return true;
}
//进栈
int Push(SqStack &S, int& e) {
if (S.top >= MaxSize-1) {
return -1;
}
S.top++;
S.data[S.top] = e;
return e;
}
//出栈
int Pop(SqStack& S, int& e) {
if (S.top == -1) {
return -1;
}
e= S.data[S.top];
S.top--;
return e;
}
int main() {
SqStack S;
initSqStack(S);
int push;
bool loop=true;
while (loop) {
scanf("%d", &push);
Push(S, push);
if (S.top == 3) {
loop = false;
}
}
int pop;
scanf("%d", &pop);
int popElement=Pop(S, pop);
for (int i = 0; i <= S.top; i++) {
printf("%d ", S.data[i]);
}
printf("%d", popElement);
}
测试:
3.2栈的链式存储
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#define MaxSize 10
#define TRUE 1
#define FALSE 0
typedef struct Stack {
int data;
struct Stack *next;
}*LinkStack,LinkStackNode;
//初始化链栈
LinkStack initLinkStack(LinkStack &S) {
S = NULL;
return S;
}
bool isEmpty(LinkStack S) {
if (S == NULL) {
return true;
}
}
入栈
bool Push(LinkStack &S, int e) {
LinkStackNode* p = (LinkStackNode*)malloc(sizeof(LinkStackNode));
if (!p) {
return false;
}
p->data = e;
p->next = S;
S = p; //让栈顶指针指向插入的结点
return true;
}
//出栈
bool Pop(LinkStack &S, int& e) {
if (S == NULL) {
return false;
}
//1.没有p,如果先修改栈顶指针,free()节点会free栈顶后的一个节点
//2.没有p,如果先free栈顶元素,那么没法修改栈顶指针
//拥有p记录S指向的元素,那么就可以修改指针后,在之后直接free() p指向的结点,释放栈顶元素
LinkStackNode* p;
p = S;
e = S->data;
S = p->next;
free(p);
return true;
}
//获取栈顶元素
int getTopEle(LinkStack& S) {
if (S) {
return S->data;
}
return -999999; //栈为空时返回-99999
}
int main() {
LinkStack S;
initLinkStack(S);
bool loop = true;
int pushEle=0;
int count=0;
while (loop) {
scanf("%d", &pushEle);
Push(S, pushEle);
count++;
if (count == 4) {
break;
}
}
int popEle=0;
printf("输入出栈元素:");
scanf("%d", &popEle);
printf("获取此刻栈顶元素为:");
Pop(S, popEle);
int res=getTopEle(S);
printf("%d", res);
}
测试:
当输入四个元素,出栈一个后,栈顶元素为:33,符合。