线性表---栈和队列

1.栈

1.1定义

特点:“后进先出”的线性表,简称LIFO表(Last In First Out)

栈是限定在表尾进行插入和删除操作的线性表

就像大家上网的时候,在打开许多网页之后要回到上一个网页,会用到“回退”按钮。如果依次点击“回退”按钮就可以按照访问顺序的逆序加载浏览过得网页,这个操作就是通过“栈”来实现的。

  • 栈顶:允许进行插入或者删除操作的一端
  • 栈底:栈顶的另一端
  • 图示:
    在这里插入图片描述
1.2基本操作
void Init_Stack(S)//初始化
void Empty_Stack(S)//判断栈空
void Push_Stack(S)//入栈
void pop_Stack(S)//出栈
int Top_Stack(S)//读取栈顶元素
1.3存储结构
  • 顺序栈:利用顺序存储结构表示的栈
  • 链栈:利用链式存储结构实现的栈,通常用单链表表示
  • 顺序栈的类型描述如下:
#define MAXSIZE 20
typedef struct {
	int elem[MAXSIZE];
	int top;
}SeqStack;
  • 链栈的类型描述如下:
typedef struct node{
	int data;
	struct node *next;	
}Node;
typedef struct LinkStack{
	Node *top;
	int count;
}LinkStack;
1.4两个栈的共享空间

“栈底位置不变,栈顶位置动态变化”,两个栈底分别为-1,MAXSIZE

在这里插入图片描述

  • 左栈入栈时,栈顶指针加一,右栈入栈时,栈顶指针减一

2.队列

2.1队列的概念(可以联想排队时)
  • 特点:“先进先出”

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,

队尾:进行插入操作的一端
队头:进行删除操作的一端
在这里插入图片描述

2.2队列的实现

通常情况下,我们分为两种情况

  • 顺序队列: 顺序存储,又可分为

    • 静态: 数组存储队列
    • 动态: 动态分配的指针
  • 链表队列: 链式存储
    可以使用数组和链表,但是我们用链表,这样出队列会提高效率

//链式队列
typedef int QUDataType;
typedef struct QueueNode
{
 struct QueueNode* _next;
 QUDataType _data;
}QueueNode;
typedef struct Queue
{
 QueueNode* _front; // 队头
 QueueNode* _rear; // 队尾
}Queue;
1.3循环队列

其可以提高空间的利用率
在这里插入图片描述
在这里插入图片描述

发布了50 篇原创文章 · 获赞 19 · 访问量 4728

猜你喜欢

转载自blog.csdn.net/qq_44723296/article/details/101549870