栈和队列
我们以下的使用的栈或队列都是作为一个工具来解决其他问题的,我们可以把栈或队列的声明和操作写的很简单,而不必分函数写出。
ElemType stack[maxSize]; //存放栈中的元素
int top = -1; //栈顶指针(指向栈顶元素)
stack[++top] = x;
x = stack[top--];
top == -1; //栈空
top > -1; //栈非空
ElemType queue[maxSize]; //存放队列中元素
int front = -1, rear = -1; //队头(指向队头元素的前一个位置),队尾(指向队尾元素)
queue[++rear] = x;
x = queue[++front];
front == rear; //队空
front < rear; //队非空
卡特兰(Catalan)数:\(1/(n+1)C^n_{2n}\)
应用:对于n个不同元素进栈,出栈序列的个数为\(1/(n+1)C^n_{2n}\)
基本概念:
采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指向当前栈顶的位置。
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct {
ElemType data[MaxSize]; //存放栈中元素
int top; //栈顶指针
}SqStack; //Sequence Stack
基本概念:
利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数据空间,将两个站的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
栈满条件:top1 - top0 = 1(即 当两个栈顶指针相邻时栈满)
基本概念:
采用链式存储的栈称为链栈,通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。
typedef struct LinkNode {
ElemType data; //数据域
struct LinkNode *next; //指针域
}*LiStack; //List Stack
基本概念:
队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front和rear分别指向队头元素和队尾元素的位置。(这里队头指针指向队头元素的前一个位置,队尾指针指向队尾元素)(避免队空与队列中只有一个元素时无法区分)
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct {
ElemType data[MaxSize]; //存放队列元素
int front, rear; //队头指针和队尾指针
}SqQueue; //Sequence Queue
基本概念:
将顺序队列臆造为一个环状的空间,即吧存储队列元素的表从逻辑上视为一个环,称为循环队列。当队首指针Q.front=MaxSize-1后,再前进一个位置就自动到0,利用取余运算(%)。
为了区分队空队满的情况,有三种处理方式:但是无法区分队空与队满(都为Q.front == Q.rear)
队满条件:Q.size == MaxSize。
这两种情况都有Q.front == Q.rear。
基本概念:
队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表(通常设计成带头结点的单链表,方便操作)。头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点(注意与顺序队列不同)。
typedef struct LinkNode{//链式队列结点
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct { //链式队列
LinkNode *front, *rear; //队列的队头和队尾指针
}LinkQueue;
原文:https://www.cnblogs.com/blknemo/p/11306065.html