理论基础
- STL(C++标准库),栈和队列是STL里面的两个数据结构
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。
所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。
栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
232.用栈实现队列
栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili 笔记:
需要用栈去复现队列的三个基本操作:push(), pop(), peek(), empty() 将一个元素放入队列的尾部,从队列首部移除元素,返回队列首部的元素,判断队列是否为空。
push()两个数据结构的操作是一样的
pop()的话需要创建两个stack,stackin,stackout,需要先判断stackout是否为空才能开始操作,只要stackin里面有数据,那么把stackin的值先弹出到stackout里面,,这样可以从1-> 2 -> 到 3->2->1 到 1<-2<-3,最后再result = stackout.top()
peek()可以重复pop的操作,之后再把取出来的数据push回去
如果stackin和stackout都是空的话,那么这个队列是空的
自己写代码的时候遇到的问题以及debug记录:
1. 在哪里定义两个栈:是属于class的全局变量,不能只在某一个方法中定义
正常写的时候需要这三句:
#include<iostream>
using namespace std;
#include<stack>
2.use of undeclared identifier 'result' result = stackOut.top(); -> 忘记定义result的数据类型,int
最后成功的代码:
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
//构造函数,暂时用不上
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty()){
while(!stackIn.empty()){
stackOut.push(stackIn.top());//出栈获得了入栈最后进去的数据
stackIn.pop();//入栈释放内存
}
}
int result = stackOut.top(); //获取队列首部的值
stackOut.pop(); //移除队列首部的值
return result;
}
int peek() {
int result = this->pop(); //直接调用移除第一位数据的方法,注意这里的调用写法
stackOut.push(result); //因为只是取值,所以要把移除的数据再放回去
return result;
}
bool empty() {
return stackIn.empty()&& stackOut.empty();
}
};
225. 用队列实现栈
假如我们放了 1 2 3 三个元素,对于栈来说,它弹出数据的顺序是3 2 1,但是队列弹出数据的顺序还是 1 2 3,所以我们可以先弹出队列中size-1个元素,再把他们push进队列,之后再弹出第一个元素,每一次都这么循环往复直到队列是empty
自己写代码出现的问题:
while(size)这个括号里面没有写size--,我和上面的size--搞混淆了,while(size--)里面的size--其实是放在循环的最后,也就是每次做完移动的操作,size--,这样才能从下一个开始移动,在更改完这个bug之后,就通过测试了
class MyStack {
public:
//创建队列
queue <int> q;
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
int size = q.size();
size--;
while(size){
//先把队列的第一个元素放进q
q.push(q.front());
//再移除队列的第一个元素
q.pop();
}
int result = q.front();
q.pop();
return result;
}
//模拟栈第一个弹出的元素:也就是队列里最后一个元素
int top() {
return q.back();
}
bool empty() {
return q.empty();
}
};
正确代码
class MyStack {
public:
//创建队列
queue <int> q;
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
int size = q.size();
size--;
while(size--){
//先把队列的第一个元素放进q
q.push(q.front());
//再移除队列的第一个元素
q.pop();
}
int result = q.front();
q.pop();
return result;
}
//模拟栈第一个弹出的元素:也就是队列里最后一个元素
int top() {
return q.back();
}
bool empty() {
return q.empty();
}
};
总结
只是在学java的时候学到过栈的概念,队列和栈在c++的表达方式甚至是第一次接触到的,学到了很多东西,但是这次的东西比以前的少一点,而且我的熟练度上去了,所以这次需要的时间变少了,只有1h30min