栈和队列的基本概念
栈的基本概念
- 栈的定义:只能在顶端进行插入和删除操作的线性表(栈顶 + 栈底 + 入栈 + 出栈 + 先进先出)
- 栈的存储结构:顺序栈 + 链式栈
队列的基本概念
- 允许在一端进行插入,在另一端进行删除的线性表(队头 + 对尾 + 入队 + 出队 + 先进先出)
- 队列的存储结构:顺序队 + 链队
栈和队列的存储结构、算法和应用
栈和队列的存储结构
- 顺序栈
#define maxSize 100
typedef struct {
int data[maxSize];
int top; //栈顶元素的位置
}SqStack
- 链栈的定义:结点 + 栈顶结点的指针
即为一个结点LNode
typedef struct SNode {
int data;
struct SNode *next;
}SNode;
- 顺序队列
typedef struct {
int data[maxSize];
int front; //描述对头的位置
int rear; //描述对尾的位置
}
- 链队:结点的定义 + 对头和对尾指针
1、链队结点的定义
typedef struct QNode {
int data;
struct QNode *next;
}QNode;
2、链队的定义
typedef struct {
QNode *front;
QNode *rear;
}
顺序栈的基本操作(P57)
- 栈空:st.top == -1; 栈底位置为0;即st.top == 0表示有一个元素
- 栈满:st.top == maxSize -1;栈底位置从0开始的
- 初始化:st.top = -1;(有结构体存在的情况下,没有的话则:int data[maxSize];st.top = -1;)
- 进栈:st.data[++top] = x; 要注意判断栈满的情况
- 出栈:x = st.data[top–];咬住判断栈空的情况
链栈的基本操作
SNode s即为链栈的头结点
判空 + 栈满(不存在) + 初始化(创建头结点) + 进栈(前插法) +
出栈(结点的删除,记得free)
栈的应用
顺序栈的应用:应用于需要有记忆功能的问题:括号匹配 + 中缀表达式转化为后缀表达式
顺序队的算法操作
- 循环队列(P61):队尾位置rear有元素,对头位置front没元素(也就是说要求元素出队和入队,都要先改变rear和front:使rear指向空位置,front指向有数据的位置,因此又要先+1,再%),会损失一个存储空间(front位置,用于区分对空还是队满)
- 队空:qu.rear == qu.front
- 队满:(qu.rear + 1)%maxSize == qu.front
- 入队:(判断队满)
qu.rear = (qu.rear + 1)%maxSize;
qu.data[qu.rear] = x;
- 出队:(判断队空)
qu.front= (qu.front+ 1)%maxSize;
x = qu.data[qu.front];
链队的操作
- 队空状态:lqu->rear == null|| lqu->front == null
- 入队:lqu->rear->next = p;lqu->rear = p;
注意:如果是第一个结点时需特殊处理 - 出队:p = lqu->front;lqu->front = p->next;x=p->data;free(p)
注意:没元素时不能出队 + 当时最后一个结点时要做特殊处理 - 初始化:malloc(lqu) + lqu->front = lqu->rear = null