当前位置:   article > 正文

Day10|Leetcode 232. 用栈实现队列 Leetcode 225. 用队列实现栈

Day10|Leetcode 232. 用栈实现队列 Leetcode 225. 用队列实现栈

首先我们在做栈和队列之前一定要做好基础知识的储备,包括一些底层逻辑 代码随想录 

这里默认基础知识都会了:

Leetcode 232 用栈实现队列 

题目链接 232 用栈实现队列

push()是输入元素 

top()是取出栈顶元素,不会删掉栈里边的元素

pop()是删除栈顶元素

直接上代码加注释:

  1. class MyQueue {
  2. public:
  3. stack<int> stIn;//定义两个栈来模拟队列
  4. stack<int> stOut;
  5. MyQueue() {
  6. }
  7. void push(int x) {
  8. stIn.push(x);//push()是将元素输入栈中
  9. }
  10. int pop() {
  11. if(stOut.empty()){//首先要保证输出栈为空,要不然会影响输出元素的顺序
  12. while(!stIn.empty()){//只要输入栈没有空,就不停的将元素输出给输出栈
  13. stOut.push(stIn.top());//将输入栈的栈顶元素输出给输出栈
  14. stIn.pop();//删除输入站的栈顶元素
  15. }
  16. }
  17. int result = stOut.top();//用result记录输出栈的顶部元素
  18. stOut.pop();//移除顶部元素
  19. return result;
  20. }
  21. int peek() {//peek是用来返回顶元素的值
  22. int res = this->pop();//直接调用pop函数(这里删除了顶元素)
  23. stOut.push(res);//把顶元素补上,做到不删除元素
  24. return res;
  25. }
  26. bool empty() {
  27. return stIn.empty()&&stOut.empty();//如果为空,就返回空
  28. }
  29. };
  30. /**
  31. * Your MyQueue object will be instantiated and called as such:
  32. * MyQueue* obj = new MyQueue();
  33. * obj->push(x);
  34. * int param_2 = obj->pop();
  35. * int param_3 = obj->peek();
  36. * bool param_4 = obj->empty();
  37. */

Leetcode 225 用队列实现栈

题目链接 225 用队列实现栈

该题目有两个方法,第一个方法:用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。

代码:

  1. class MyStack {
  2. public:
  3. queue<int> que1;
  4. queue<int> que2; // 辅助队列,用来备份
  5. MyStack() {
  6. }
  7. void push(int x) {
  8. que1.push(x);
  9. }
  10. int pop() {
  11. int size = que1.size();
  12. size--;
  13. while (size--) { // 将que1 导入que2,但要留下最后一个元素
  14. que2.push(que1.front());
  15. que1.pop();
  16. }
  17. int result = que1.front(); // 留下的最后一个元素就是要返回的值
  18. que1.pop();
  19. que1 = que2; // 再将que2赋值给que1
  20. while (!que2.empty()) { // 清空que2
  21. que2.pop();
  22. }
  23. return result;
  24. }
  25. int top() {
  26. return que1.back();
  27. }
  28. bool empty() {
  29. return que1.empty();
  30. }
  31. };

第二个方法是在第一个方法前提下做优化:

一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。

上代码加注释:

  1. class MyStack {
  2. public:
  3. queue<int> que;
  4. MyStack() {
  5. }
  6. void push(int x) {
  7. que.push(x);
  8. }
  9. int pop() {
  10. int size = que.size();//记录队列的长度,为了要取出最后一个元素
  11. size--;//将队列前size-1个元素提取出来就解决了
  12. while(size--){
  13. que.push(que.front());//先将首元素提取出来放到队列最后面
  14. que.pop();//在将首元素弹出
  15. }
  16. int result = que.front();//记录首元素(此时是队列的最后一个元素)
  17. que.pop();//删除
  18. return result;
  19. }
  20. int top() {
  21. return que.back();//队列中的最后一个元素是back
  22. }
  23. bool empty() {
  24. return que.empty();
  25. }
  26. };
  27. /**
  28. * Your MyStack object will be instantiated and called as such:
  29. * MyStack* obj = new MyStack();
  30. * obj->push(x);
  31. * int param_2 = obj->pop();
  32. * int param_3 = obj->top();
  33. * bool param_4 = obj->empty();
  34. */

end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/751134
推荐阅读
相关标签
  

闽ICP备14008679号