-
学习栈与队列
栈的底层实现可以换成vector,list,deque, -
利用两个栈实现队列,内部逻辑很熟悉,但是在vscode上调试不了这种题,再去看一遍解答,免得自己调试浪费时间,再写一遍解答:
class MyQueue { public: stack<int> stIn; stack<int> stOut; MyQueue() { } void push(int x) { stIn.push(x); } int pop() { if(stOut.empty()) { while(!stIn.empty()) { stOut.push(stIn.top()); stIn.pop(); } } int a=stOut.top(); stOut.pop(); return a; } int peek() { int a=this->pop(); stOut.push(a); return a; } bool empty() { return stIn.empty()&&stOut.empty(); } };
pop()那里还是好理解的,重点是peek那里,实现结构先进先出,那么peek实际上可以将队列尾部元素取出来,就是stOut的尾部元素,本来就是顶端元素就是这个元素,那么将这个顶端元素pop掉,然后根据stOut的特性,又将元素压栈进去,就可以了。
225.用队列实现栈,有点迷糊了哈,题目是说要用队列实现栈,可以用deque,我直接使用到了deque的双端队列,双端操作了,没有理会到这个出题的意思哈,重新想一下:队列就是先进先出,为了实现先进后出,就是倒两遍
1-2-3 这个时候应该是让1出来,怎么办,将前面两个数2-3 pop出去,再push进去,得到2-3-1,这个时候pop的第一个就是先进去的元素 1,剩下的2-3,仍然是之前的那个顺序,按照这个继续以上操作就好了,如果是两个队列,第二个队列也是临时队列的作用,跟上面的一个队列的实现形式还是一样的;
再解一遍:class MyStack { public: deque<int> res; MyStack() { } void push(int x) { res.push_front(x); } int pop() { int len=res.size()-1; while (len--) { int a=res.back(); res.pop_back(); res.push_front(a); } int a=res.back(); res.pop_back(); return a; } int top() { int a=this->pop(); res.push_front(a); return a; } bool empty() { return res.empty(); } };
栈与队列实现
最新推荐文章于 2024-07-19 15:45:46 发布