用两个队列实现一个栈 c++
时间: 2023-05-27 18:05:36 浏览: 136
两个队列实现一个栈
4星 · 用户满意度95%
可以用两个队列来模拟一个栈的数据结构,具体实现如下:
1. 定义两个队列queue1和queue2;
2. 将元素压入栈时,将元素放入queue1中;
3. 将元素弹出栈时,先将queue1中的元素依次出队并放入queue2中,直到queue1中只剩一个元素,将该元素出队返回即可;
4. 在弹出元素时,如果queue1中只有一个元素,直接出队返回即可,不需要将元素放入queue2中;
5. 在弹出元素时,交换queue1和queue2的指针,使得下一次弹出时可以从另一个队列中取出元素;
6. 使用两个队列实现的栈,其空间复杂度为O(n),其中n为栈中元素的个数。
以下是使用C语言实现的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue {
int* data;
int front;
int rear;
} Queue;
typedef struct Stack {
Queue* queue1;
Queue* queue2;
} Stack;
Queue* createQueue(int size) {
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->data = (int*)malloc(sizeof(int) * size);
queue->front = 0;
queue->rear = 0;
return queue;
}
Stack* createStack(int size) {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->queue1 = createQueue(size);
stack->queue2 = createQueue(size);
return stack;
}
void push(Stack* stack, int value) {
stack->queue1->data[stack->queue1->rear] = value;
stack->queue1->rear++;
}
int pop(Stack* stack) {
int value = 0;
if(stack->queue1->front == stack->queue1->rear) {
printf("Stack is empty.\n");
return -1;
}
while(stack->queue1->front < stack->queue1->rear - 1) {
stack->queue2->data[stack->queue2->rear] = stack->queue1->data[stack->queue1->front];
stack->queue1->front++;
stack->queue2->rear++;
}
value = stack->queue1->data[stack->queue1->front];
stack->queue1->front++;
Queue* temp = stack->queue1;
stack->queue1 = stack->queue2;
stack->queue2 = temp;
return value;
}
int main() {
Stack* stack = createStack(10);
push(stack, 1);
push(stack, 2);
push(stack, 3);
printf("%d\n", pop(stack));
push(stack, 4);
printf("%d\n", pop(stack));
printf("%d\n", pop(stack));
printf("%d\n", pop(stack));
printf("%d\n", pop(stack));
return 0;
}
```
阅读全文