问题描述:用C语言设计并编码一个程序实现借用一个栈S将一个队列Q逆置
时间: 2023-06-19 14:09:43 浏览: 201
实现思路:
1. 首先,将队列 Q 中的所有元素依次出队,压入一个辅助栈 S 中;
2. 然后,将栈 S 中的所有元素依次出栈,再压入队列 Q 中;
3. 这样,队列 Q 中的元素就被逆置了。
代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化队列
void initQueue(Queue *q) {
q->front = 0;
q->rear = 0;
}
// 入队
void enqueue(Queue *q, int x) {
if (q->rear == MAX_SIZE) {
printf("队列已满,无法入队!\n");
return;
}
q->data[q->rear++] = x;
}
// 出队
int dequeue(Queue *q) {
if (q->front == q->rear) {
printf("队列已空,无法出队!\n");
exit(1);
}
return q->data[q->front++];
}
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 入栈
void push(Stack *s, int x) {
if (s->top == MAX_SIZE - 1) {
printf("栈已满,无法入栈!\n");
exit(1);
}
s->data[++s->top] = x;
}
// 出栈
int pop(Stack *s) {
if (s->top == -1) {
printf("栈已空,无法出栈!\n");
exit(1);
}
return s->data[s->top--];
}
// 将队列逆置
void reverse(Queue *q) {
Stack s;
initStack(&s);
while (q->front != q->rear) {
push(&s, dequeue(q));
}
while (s.top != -1) {
enqueue(q, pop(&s));
}
}
int main() {
Queue q;
initQueue(&q);
printf("请输入队列元素个数:");
int n, x;
scanf("%d", &n);
printf("请输入队列元素:");
for (int i = 0; i < n; i++) {
scanf("%d", &x);
enqueue(&q, x);
}
printf("逆置前队列元素:");
for (int i = q.front; i < q.rear; i++) {
printf("%d ", q.data[i]);
}
printf("\n");
reverse(&q);
printf("逆置后队列元素:");
for (int i = q.front; i < q.rear; i++) {
printf("%d ", q.data[i]);
}
printf("\n");
return 0;
}
```
运行程序,输入队列元素个数和元素,即可将队列逆置。
阅读全文