力扣题号:225. 用队列实现栈
一、题目描述
请你仅使用一个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
注意:
- 你只能使用队列的标准操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
二、示例
Stack S;
Stack_init(S);
push(S, 1);
push(S, 2);
push(S, 3);
cout << top(S) << endl;
push(S, 4);
push(S, 5);
cout << pop(S) << " ";
cout << pop(S) << " ";
cout << pop(S) << " ";
cout << pop(S) << " ";
cout << pop(S) << endl << endl;
cout << pop(S) << endl;
三、求解思路
四、代码实现
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <iostream>
using namespace std;
#define MAX_SIZE 100 // 定义队列的最大容量
typedef struct {
int data[MAX_SIZE];
int front; // 队首
int rear; // 队尾
int size; // 队列当前大小
} Queue;
// 初始化队列
void initQueue(Queue& q) {
q.front = 0;
q.rear = -1;
q.size = 0;
}
// 判断队列是否为空
bool isEmpty(Queue& q) {
return q.size == 0;
}
// 判断队列是否已满
bool isFull(Queue& q) {
return q.size == MAX_SIZE;
}
// 入队操作
bool enqueue(Queue& q, int value) {
if (isFull(q)) {
printf("Queue is full!\n");
return false;
}
q.rear = (q.rear + 1) % MAX_SIZE; // 循环队列,当到达数组末尾时回到开头
q.data[q.rear] = value;
q.size++;
return true;
}
// 出队操作
bool dequeue(Queue& q, int& value) {
if (isEmpty(q)) {
printf("Queue is empty!\n");
return false;
}
value = q.data[q.front];
q.front = (q.front + 1) % MAX_SIZE; // 同理,循环队列
q.size--;
return true;
}
// 打印队列内容
void printQueue(Queue& q) {
if (isEmpty(q)) {
printf("Queue is empty!\n");
return;
}
printf("Queue: ");
for (int i = q.front; i != q.rear + 1; i = (i + 1) % MAX_SIZE) {
printf("%d ", q.data[i]);
}
printf("\n");
}
typedef struct Stack {
Queue q;
}Stack;
// 初始化栈
void Stack_init(Stack& S) {
initQueue(S.q);
}
// 元素 x 入栈
bool push(Stack& S, int x) {
return enqueue(S.q, x);
}
// 移除栈顶元素
int pop(Stack& S) {
int size = S.q.size - 1;
int x;
while (size-- > 0)
{
dequeue(S.q,x);
enqueue(S.q,x);
}
if (dequeue(S.q, x)) {
return x;
}
else{
return -1;
}
}
// 获取栈顶元素
int top(Stack& S) {
return S.q.data[S.q.rear];
}
// 返回栈是否为空
bool empty(Stack& S) {
return isEmpty(S.q);
}
// 返回栈是否为满
bool full(Stack& S) {
return isFull(S.q);
}
int main() {
Stack S;
Stack_init(S);
push(S, 1);
push(S, 2);
push(S, 3);
cout << top(S) << endl;
push(S, 4);
push(S, 5);
cout << pop(S) << " ";
cout << pop(S) << " ";
cout << pop(S) << " ";
cout << pop(S) << " ";
cout << pop(S) << endl << endl;
cout << pop(S) << endl;
return 0;
}