一、队列的存储及其基本方法
- 顺序存储
// 队列的定义方式:
#define MAXSIZE 50
typedef struct {
int data[MAXSIZE];
int front, rear;
}SqQueue;
- 普通队列的基本操作
//初始化
void initQueue(SqQueue &q){
q.front = 0;
q.rear = 0;
}
// 判空
q.rear == q.front;
// 普通队列判满
q.rear + 1 == MAXSIZE;
// 入队操作
bool enqueue(SqQueue &q, int x){
if(q.rear + 1 == MAXSIZE) return false;
q.data[q.rear] = x;
q.rear ++;
return true;
}
// 出队操作
bool dequeue(SqQueue &q,int &x){
if(q.rear == q.front) return false;
x = q.data[q.front];
q.front++;
return true;
}
- 循环队列
//初始化
void initQueue(SqQueue &q){
q.front = 0;
q.rear = 0;
}
// 循环队列判满
q.front == (q.rear + 1) % MAXSIZE;
// 队列中的基本元素个数
(q.rear - q.front + MAXSIZE) % MAXSIZE;
// 入队操作
bool enqueue(SqQueue &q, int x){
if(q.front == (q.rear + 1) % MAXSIZE) return false;
q.data[q.rear] = x;
q.rear = (q.rear + 1) % MAXSIZE;
return true;
}
// 出队操作
bool dequeue(SqQueue &q,int &x){
if(q.rear == q.front) return false;
x = q.data[q.front];
q.front = (q.front + 1) % MAXSIZE;
return true;
}
- 链式存储
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}*LinkQueue;
// 初始化
void initQueue(LinkQueue &q){
q.front = new LinkNode;
q.rear = q.front;
q.front->next = NULL;
}
// 判空
bool isEmpty(LinkQueue &q){
return q.front == q.rear;
}
// 入队
bool enqueue(LinkQueue &q, int x){
LinkNode *s = new LinkNode;
s->data = x;
q.rear->next = s;
q.rear = s;
s->next = NULL;
}
// 出队
bool dequeue(LinkQueue &q, int &x){
if(q.rear == q.front) return false;
LinkNode *p = q.front->next;
x = p->data;
q.front->next = p->next;
if(p == q.rear) q.rear = q.front;
free(p);
return true;
}
二、习题
第一题:
在循环队列中,设置一个标志域tag,并以tag的值为0和1来区分队头指针front和rear相同的状态是空还是满,然后编写出入对算法。
基本思想:
- tag进队置为1,出队置为0.
- 队空条件:
q.front == q.rear && q.tag == 0
- 队满条件:
q.front == q.rear && q.tag == 1
#define MAXSIZE 50
typedef struct {
int data[MAXSIZE];
int front, rear;
int tag;
}SqQueue;
int enqueue(SqQueue &q,int x){
if(q.front == q.rear && q.tag == 1) return 0;
q.data[q.rear] = x;
q.rear = (q.rear + 1) % MAXSIZE;
q.tag = 1;
return 1;
}
int dequeue(SqQueue &q, int &x){
if(q.front == q.rear && q.tag == 0) return 0;
x = q.data[q.front];
q.front = (q.front + 1) % MAXSIZE;
q.tag = 0;
return 1;
}
第二题:
利用栈将队列的元素逆置
void reverse(SqQueue &q,Stack s){
while(!isEmpty(q)){
int x = dequeue(q);
push(s, x);
}
while(!isEmpty(s)){
int x = pop(s);
dequeue(q, x);
}
}
第三题:
利用两个栈来模拟队列
算法思路:
入队的数据直接存放在S1栈
出队的时候,将数据依次出栈入栈到S2中,弹出栈顶元素即可,最后将S2的数据再一次出栈入栈到S1中。