栈
熟悉操作之前,我们需要先了解栈的特性,是先进后出,只能从栈顶入栈和出栈
顺序结构
利用数组一块连续的存储空间实现栈,需要一个变量来执行栈顶
#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
//顺序存储方式,利用数据
#define MaxSize 50
typedef int ElementType;
typedef struct {
ElementType data[MaxSize];
int top;//执行栈顶的指针,存储栈顶的下标
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top=-1;//初始化栈顶指针
}
//判断栈是否为空
bool StackEmpty(SqStack S){
if(S.top==-1){
return true;
}
return false;
}
//进栈
bool Push(SqStack &S,ElementType x){
//由于使用的是顺序存储,所以存储空间有限,需要判断栈是否满
if(S.top+1==MaxSize) return false;
S.data[++S.top]=x;//栈不满进栈,++S.top等价先赋值,再加1
return true;
}
//出栈,根据栈的特性,所以出栈的时候需要从栈顶开始删除元素。
bool Pop(SqStack &S,ElementType &x)//将出栈的元素赋值给x
{
if(StackEmpty(S)) return false;
x=S.data[S.top--];//先出栈再-1
return true;
}
//读取栈顶元素,不需要删除
bool GetTop(SqStack &S,ElementType &x){
if(StackEmpty(S)) return false;
x=S.data[S.top];
return true;
}
int main (){
SqStack s;
InitStack(s);
//插入一批元素
int a;
scanf("%d",&a);
while (a!=999){
if ( Push(s,a)){
printf("入栈成功!!!");
} else{
printf("入栈失败!!!");
}
scanf("%d",&a);
}
printf("插入元素成功\n");
int x;
//依次出栈
while (s.top!=-1){
Pop(s,x);
printf("%d",x);
}
return 0;
}
链式结构
可以使用不带头结点或带头结点的的单链表实现,需要一个头指针指向栈顶元素,在插入元素的时候只能使用头插法、删除元素的时候只能时候头指针后插法(从第一个元素开始删除)
栈的链式操作和单链表的操作及其相似(只需要注意插入和删除只能在第一个位置进行就行)
单链表的详细操作看之前这篇文章
考点
在考试的时候栈这块内容,经常考察的是给出已知的入栈顺序,要求考生能够判断出出栈顺序是否合法,这块其实大家注意栈的特性并且细心一点就可以做出来。
队列
队列也是一种操作受限的线性表,允许在一端进行插入,另一个进行删除。好比吃饭排队一样
队头(Front):允许删除的一端。
队尾(Rear):允许插入的一端。