只用两个顺序栈S1, S2(S1、S2的大小分别为Max1、Max2)模拟一个顺序队列时,不能用到其它的辅助空间。用c语言编写
时间: 2024-02-20 09:01:28 浏览: 169
通过2个栈 模拟队列。
以下是使用两个顺序栈S1和S2来模拟一个顺序队列的c语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define Max1 10 // S1的大小
#define Max2 10 // S2的大小
typedef struct {
int data[Max1];
int top; //栈顶指针
} Stack;
typedef struct {
Stack S1; // 用于入队的栈
Stack S2; // 用于出队的栈
} Queue;
void InitStack(Stack *S) {
S->top = -1;
}
void Push(Stack *S, int x) {
if (S->top == Max1 - 1) {
printf("Stack overflow\n");
exit(1);
}
S->data[++S->top] = x;
}
int Pop(Stack *S) {
if (S->top == -1) {
printf("Stack underflow\n");
exit(1);
}
return S->data[S->top--];
}
void InitQueue(Queue *Q) {
InitStack(&Q->S1);
InitStack(&Q->S2);
}
void Enqueue(Queue *Q, int x) {
if (Q->S1.top == Max1 - 1 && Q->S2.top == -1) {
printf("Queue overflow\n");
exit(1);
}
while (Q->S1.top != -1) { // 将S1中的元素全部转移到S2
Push(&Q->S2, Pop(&Q->S1));
}
Push(&Q->S1, x); // 入队
while (Q->S2.top != -1) { // 将S2中的元素全部转移到S1
Push(&Q->S1, Pop(&Q->S2));
}
}
int Dequeue(Queue *Q) {
if (Q->S1.top == -1) {
printf("Queue underflow\n");
exit(1);
}
return Pop(&Q->S1); // 出队
}
int main() {
Queue Q;
InitQueue(&Q);
Enqueue(&Q, 1);
Enqueue(&Q, 2);
Enqueue(&Q, 3);
printf("%d ", Dequeue(&Q));
printf("%d ", Dequeue(&Q));
printf("%d ", Dequeue(&Q));
return 0;
}
```
在上面的代码中,我们定义了两个结构体类型:Stack和Queue。Stack中包含了一个数组和一个栈顶指针,用于模拟栈的操作。Queue中包含了两个Stack类型的变量S1和S2,其中S1用于入队,S2用于出队,用这两个栈来模拟队列的操作。
在Enqueue函数中,我们首先判断S1和S2中是否都已经满了,如果是则说明队列已经满了,无法再入队。然后将S1中的所有元素全部转移到S2中,这样S2中的栈顶元素就是S1中的第一个入队元素,接着将新元素x入栈到S1中,最后再将S2中的所有元素全部转移回S1中,这样就完成了一次入队操作。
在Dequeue函数中,我们首先判断S1中是否有元素,如果没有则说明队列为空,无法进行出队操作。然后直接从S1中出栈一个元素即可,这就完成了一次出队操作。
阅读全文