数据结构两栈模拟一个队列c语言代码
时间: 2024-10-29 08:23:56 浏览: 22
数据结构中,我们可以使用两个栈来模拟一个队列。这是因为栈是一种后进先出(LIFO)的数据结构,而队列则是先进先出(FIFO)。下面是一个简单的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct {
int* stack1; // 栈1存储入队元素
int* stack2; // 栈2存储出队元素
int top1;
int top2;
} Queue;
// 初始化队列
void init(Queue* queue) {
queue->stack1 = (int*)malloc(sizeof(int) * MAX_SIZE);
queue->stack2 = (int*)malloc(sizeof(int) * MAX_SIZE);
queue->top1 = -1;
queue->top2 = -1;
}
// 入队操作
void enqueue(Queue* queue, int value) {
if (queue->top1 == MAX_SIZE - 1) {
printf("Queue is full.\n");
return;
}
queue->top1++;
queue->stack1[queue->top1] = value;
}
// 出队操作
int dequeue(Queue* queue) {
if (queue->top2 == -1 || queue->top1 == queue->top2) {
printf("Queue is empty.\n");
return -1; // 返回错误码,表示队列为空
}
int value = queue->stack2[queue->top2];
queue->top2--;
// 如果栈1非空,将其顶元素移到栈2
if (queue->top1 != queue->top2) {
while (queue->top1 != queue->top2) {
queue->stack2[++queue->top2] = queue->stack1[queue->top1++];
}
queue->stack2[queue->top2] = queue->stack1[queue->top1]; // 移除最后一个入队元素
queue->top1++;
}
return value;
}
// 测试
int main() {
Queue q;
init(&q);
enqueue(&q, 1); // 入队
enqueue(&q, 2);
enqueue(&q, 3);
printf("Dequeued: %d\n", dequeue(&q)); // 输出: Dequeued: 1
printf("Dequeued: %d\n", dequeue(&q)); // 输出: Dequeued: 2
return 0;
}
```
在这个代码里,我们创建了两个栈`stack1`和`stack2`。入队时,直接放入`stack1`;出队时,从`stack2`取出元素,同时处理`stack1`的元素移动到`stack2`的过程,使得总是`stack2`的顶部元素可以被访问。注意,当`stack1`和`stack2`顶部相等时,说明队列已空。
阅读全文