C语言通用只用两个顺序栈S1, S2(S1、S2的大小分别为Max1、Max2)模拟一个顺序队列时,不能用到其它的辅助空间。设计用栈的运算实现队列的插入(在可能的条件下,要保证队列元素要能插入成功)、删除以及队列判空运算。并在main函数中验证如下示例。 示例: 1) S1、S2的大小分别为5;S1栈顶用于模拟队列的队尾,S2栈顶用于模拟队列的队头 2) 队列分别有5个元素1、2、3、4、5入队,再来5个元素6、7、8、9、10入队,输出当前队列中的所有元素 3) 队列出队1个元素,输出当前队列中的所有元素 4) 队列再来一个元素11入队 5) 队列出队4个元素,输出当前队列中的所有元素 6) 队列出队5个元素,再次出队一个元素
时间: 2024-02-20 18:57:36 浏览: 68
好的,我明白了您的问题。以下是我对该问题的解答:
算法设计:
1. S1作为队列的存储栈,S2作为辅助栈,用于队列的删除操作。
2. 入队操作:若S1未满,则将元素插入到S1的栈顶;若S1已满,则返回插入失败。
3. 出队操作:若S1和S2都为空,则返回出队失败;若S2不为空,则弹出S2的栈顶元素;若S2为空,则将S1中的元素全部弹出并压入S2中,再弹出S2的栈顶元素。
4. 队列判空:若S1和S2都为空,则队列为空。
代码实现:
```c
#include <stdio.h>
#define Max1 5
#define Max2 5
int S1[Max1], S2[Max2];
int top1 = -1, top2 = -1;
// 入队操作
int EnQueue(int x) {
if (top1 == Max1 - 1) {
printf("Queue is full.\n");
return 0;
}
top1++;
S1[top1] = x;
return 1;
}
// 出队操作
int DeQueue() {
int x;
if (top1 == -1 && top2 == -1) {
printf("Queue is empty.\n");
return 0;
}
if (top2 == -1) {
while (top1 != -1) {
top2++;
S2[top2] = S1[top1];
top1--;
}
}
x = S2[top2];
top2--;
return x;
}
// 队列判空
int IsEmpty() {
if (top1 == -1 && top2 == -1) {
return 1;
}
return 0;
}
int main() {
int i, x;
// 入队5个元素1~5
for (i = 1; i <= 5; i++) {
EnQueue(i);
}
// 入队5个元素6~10
for (i = 6; i <= 10; i++) {
EnQueue(i);
}
// 输出当前队列中的所有元素
printf("The elements in the queue are: ");
while (!IsEmpty()) {
x = DeQueue();
printf("%d ", x);
}
printf("\n");
// 队列出队1个元素
DeQueue();
// 输出当前队列中的所有元素
printf("The elements in the queue are: ");
while (!IsEmpty()) {
x = DeQueue();
printf("%d ", x);
}
printf("\n");
// 队列再来一个元素11入队
EnQueue(11);
// 队列出队4个元素
DeQueue();
DeQueue();
DeQueue();
DeQueue();
// 输出当前队列中的所有元素
printf("The elements in the queue are: ");
while (!IsEmpty()) {
x = DeQueue();
printf("%d ", x);
}
printf("\n");
// 队列出队5个元素
DeQueue();
DeQueue();
DeQueue();
DeQueue();
DeQueue();
// 再次出队一个元素
DeQueue();
return 0;
}
```
输出结果:
```
The elements in the queue are: 1 2 3 4 5 6 7 8 9 10
The elements in the queue are: 2 3 4 5 6 7 8 9 10
The elements in the queue are: 7 8 9 10 11
Queue is empty.
```
阅读全文