一、前言
参考文献:代码随想录
今天的栈和队列最重要的两个因素是:先进后出,先进先出。这就是栈和队列的两个性质。
二、用栈实现队列
我第一眼看到题目比较蒙,看完卡哥的视频和文章后就又有了印象。
1、思路:
最主要的思路就是定义两个栈,来实现队列的操作。因为栈是先进先出,要在弹出的时候正确弹出,就需要把一个栈的数据全部pop到另一个栈,这个时候pop返回的数字就是队列的顺序了。
还有一些小细节,在我展示出代码后再交流。
2、代码:
class MyQueue {
private:
stack<int> stack_in;
stack<int> stack_out;
public:
MyQueue() {
}
void push(int x) {
stack_in.push(x);
}
int pop() {
if (!stack_out.empty() || !stack_in.empty()) {
if (stack_out.empty()) {
while (!stack_in.empty()) {
int temp = stack_in.top();
stack_in.pop();
stack_out.push(temp);
}
}
int result = stack_out.top();
stack_out.pop();
return result;
}
return -1;
}
int peek() {
if (!stack_out.empty() || !stack_in.empty()) {
if (stack_out.empty()) {
while (!stack_in.empty()) {
int temp = stack_in.top();
stack_in.pop();
stack_out.push(temp);
}
}
return stack_out.top();
}
return -1;
}
bool empty() {
if (stack_in.empty() && stack_out.empty()) {
return true;
}
return false;
}
};
(1)其中的两个栈的定义是私有成员,因为在函数体中定义的话,就是局部变量,其他的函数访问不了,导致无法运行。
(2)每次pop之前都得检查stack_out是否为空,不为空就可以pop,为空就必须把stack_in里面的数据传到out中去,才可以输出
(3)在返回时,不可以直接return stack_out。pop()这是错误的,必须先top取数,才能返回,pop只是把一个元素弹出来。
三、用队列实现栈
1、思路:
其实我的惯性思维就是直接用两个队列来实现。但是看完卡哥的视屏后就发现,只需要一个队列就可以了。其操作方式就是,如果队列中有n个元素,那就把n-1个元素弹出来,放到队列的后端去,再把最后一个元素弹出和返回。
2、代码:
class MyStack {
private:
queue<int> my_queue;
int lenth = 0; // 用来记录队列的长度
public:
MyStack() {
}
void push(int x) {
my_queue.push(x);
lenth++;
}
int pop() {
if (!my_queue.empty()) {
int temp = lenth - 1;
while (temp--) {
int temp2 = my_queue.front();
my_queue.pop();
my_queue.push(temp2);
}
lenth--;
int result = my_queue.front();
my_queue.pop();
return result;
}
return -1;
}
int top() {
if (!my_queue.empty()) {
queue<int> tmp_queue = my_queue;
int temp = lenth - 1;
while (temp--) {
int temp2 = tmp_queue.front();
tmp_queue.pop();
tmp_queue.push(temp2);
}
int result = tmp_queue.front();
// delete tmp_queue;
return result;
}
return -1;
}
bool empty() {
return my_queue.empty();
}
};
代码就是这些了,其中的top()需要利用一个queue来临时存储my_queue这样就不会破坏其原本队列的结构。
今日学习时间1小时