力扣题号:232. 用栈实现队列
一、题目描述
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
二、示例
Queue Q;
Queue_init(Q);
Queue_push(Q, 1);
Queue_push(Q, 2);
Queue_push(Q, 3);
cout << Queue_peek(Q) << " ";
Queue_push(Q, 4);
Queue_push(Q, 5);
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << endl;
三、求解思路
四、代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <iostream>
using namespace std;
#define MAX_SIZE 100 // 定义栈的最大容量
typedef struct {
int data[MAX_SIZE]; // 存储数据的数组
int top; // 栈顶的位置,初始化为-1(空栈)
} Stack;
// 初始化栈
void initStack(Stack& s) {
s.top = -1;
}
// 判断栈是否为空
bool isEmpty(Stack& s) {
return s.top == -1;
}
// 判断栈是否已满
bool isFull(Stack& s) {
return s.top == MAX_SIZE - 1;
}
// 入栈操作
bool push(Stack& s, int value) {
if (isFull(s)) {
printf("Stack is full\n");
return false;
}
s.data[++s.top] = value; // 先移动栈顶指针,再存储数据
return true;
}
// 出栈操作
bool pop(Stack& s, int& value) {
if (isEmpty(s)) {
printf("Stack is empty\n");
return false;
}
value = s.data[s.top--]; // 先取出数据,再移动栈顶指针
return true;
}
// 查看栈顶元素
bool peek(Stack& s, int& value) {
if (isEmpty(s)) {
printf("Stack is empty\n");
return false;
}
value = s.data[s.top];
return true;
}
typedef struct {
Stack s_in;
Stack s_out;
}Queue;
// 初始化队列
void Queue_init(Queue& Q) {
initStack(Q.s_in);
initStack(Q.s_out);
}
// 将一个元素放入队列的尾部。
bool Queue_push(Queue& Q,int x) {
return push(Q.s_in, x);
}
// 返回队列首部的元素。
int Queue_peek(Queue& Q) {
int x;
if (isEmpty(Q.s_out)) {
while (!isEmpty(Q.s_in)) {
peek(Q.s_in, x);
push(Q.s_out, x);
pop(Q.s_in,x);
}
}
return peek(Q.s_out, x);
}
// 从队列首部移除元素。
int Queue_pop(Queue& Q) {
int x;
Queue_peek(Q);
pop(Q.s_out, x);
return x;
}
// 返回队列是否为空。
bool Queue_empty(Queue& Q) {
return !isEmpty(Q.s_in) && !isEmpty(Q.s_out);
}
int main(){
Queue Q;
Queue_init(Q);
Queue_push(Q, 1);
Queue_push(Q, 2);
Queue_push(Q, 3);
cout << Queue_peek(Q) << " ";
Queue_push(Q, 4);
Queue_push(Q, 5);
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << " ";
cout << Queue_pop(Q) << endl;
return 0;
}