当前位置:   article > 正文

代码随想录算法训练营| 第五章 栈与队列part01

代码随想录算法训练营| 第五章 栈与队列part01

力扣232 用栈实现队列

题目链接/文章讲解/视频讲解:代码随想录

对栈的简单介绍:

在C++中,stack标准模板库(STL)中提供的一种数据结构,表示栈(stack),它通常用于后进先出(LIFO)的数据管理。让我解释一下相关的操作:

  1. stack.push(): 这个操作用于将元素压入栈顶(即入栈操作)。例如,如果你有一个stack<int> st;,你可以通过st.push(5);将整数5压入栈st的顶部。

  2. stack.pop(): 这个操作用于从栈顶移除元素(即出栈操作)。例如,如果你有一个非空的栈st,通过st.pop();将移除栈顶的元素。

  3. stack.top(): 这个操作返回栈顶元素的引用,但不会移除它。这可以让你访问栈顶的元素而不改变栈的内容。例如,如果你有一个栈st,你可以通过st.top();来获取栈顶的元素值,而不会将其从栈中移除

思路:创建一个输入栈一个输出栈

  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);
  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();
  18. stOut.pop();
  19. return result;
  20. }
  21. int peek() {
  22. int res = this -> pop();
  23. stOut.push(res);
  24. return res;
  25. }
  26. bool empty() {
  27. if(stOut.empty() && stIn.empty()){
  28. return true;
  29. }
  30. return false;
  31. }
  32. };

 

力扣225 用队列实现栈

题目链接/文章讲解/视频讲解:代码随想录

思路:创建两个队列,一个用来备用。

  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() - 1;
  12. while(size--){
  13. que2.push(que1.front());
  14. que1.pop();
  15. }
  16. int res = que1.front();
  17. que1.pop();
  18. que1 = que2;
  19. while(!que2.empty()){
  20. que2.pop();
  21. }
  22. return res;
  23. }
  24. int top() {
  25. return que1.back();
  26. }
  27. bool empty() {
  28. if(que1.empty()){
  29. return true;
  30. }
  31. return false;
  32. }
  33. };

第一次见到queue.back()

在 C++ 中,queue.back() 是 queue 类型的成员函数,用于获取队列 queue 中最后一个元素的引用,而不移除它。

具体来说:

  • 如果你有一个 queue<int> q;,可以使用 q.back() 来获取队列 q 中最后一个元素的引用。
  • 这个操作不会改变队列的内容,只是返回最后一个元素的引用。
  • 如果队列是空的(即没有任何元素),调用 q.back() 是不安全的,因为队列中没有元素可以返回。

使用 queue.back() 可以方便地访问队列中最后一个入队的元素,但要注意,它只适用于非空队列的情况。

  在C++标准库中,queue.back() 的底层实现依赖于队列(queue)的具体实现方式。一般来说,队列可以基于不同的数据结构实现,最常见的是使用双端队列(deque)作为其底层容器。

   具体来说,queue 是一个适配器,它通过封装一个底层容器来提供队列的功能。在使用默认参数时,queue 使用 deque 作为其默认底层容器。因此,queue.back() 实际上调用了 deque.back(),这是 deque 类型的成员函数。

    在 deque 中,back() 函数用于获取队列中最后一个元素的引用,而不会将其从队列中移除。因此,当你调用 queue.back() 时,它会委托给 deque.back() 来实现这一功能。

    需要注意的是,如果你使用了自定义的底层容器或者不使用默认参数创建了 queue,那么 queue.back() 的具体行为可能会因底层容器的不同而有所不同。然而,大多数情况下,使用默认参数的 queue 使用 deque 作为底层容器,以上述描述为准。

 

力扣20 有效的括号

题目链接/文章讲解/视频讲解:代码随想录

思路:这道题目只需考虑所有不匹配的情况即可。一种是左括号多余,一种是括号匹配错误,一种是右括号多余。在代码中表现为,每遇到一个左括号,将一个相应的右括号入栈。每遇到一个右括号就和栈顶括号比是否相同,如果相同则将栈顶元素出栈。如果不同则说明匹配错误,返回false。如果栈为空,说明右括号多余,返回false。 将整个字符串遍历完后,检查栈是否为空,如果为空说明匹配正确,返回true(即st.empty())。  如果不为空,说明左括号多余,返回false(即st.empty())。

  1. class Solution {
  2. public:
  3. bool isValid(string s) {
  4. if(s.size() % 2 != 0){
  5. return false;
  6. }
  7. stack<int> st;
  8. for(int i = 0; i < s.size(); i++){
  9. if(s[i] == '('){
  10. st.push(')');
  11. }
  12. else if(s[i] == '{'){
  13. st.push('}');
  14. }
  15. else if(s[i] == '['){
  16. st.push(']');
  17. }
  18. else if(st.empty() || s[i] != st.top()){
  19. return false;
  20. }
  21. else{
  22. st.pop();
  23. }
  24. }
  25. return st.empty();
  26. }
  27. };

力扣1047  删除字符串中的所有相邻重复项

题目链接/文章讲解/视频讲解:代码随想录

思路:遍历字符串中的每个元素,如果与栈顶元素相同,就将栈顶元素出栈消除。如果不同则将该元素入栈。最后将栈中元素依次出栈存入字符串中,因为先入后出的缘故,需要反转字符串得到正确顺序。

  1. class Solution {
  2. public:
  3. string removeDuplicates(string s) {
  4. stack<int> st;
  5. for(int i = 0; i < s.size(); i++){
  6. if(st.empty()){
  7. st.push(s[i]);
  8. continue;
  9. }
  10. if(s[i] == st.top()){
  11. st.pop();
  12. }
  13. else{
  14. st.push(s[i]);
  15. }
  16. }
  17. string res = "";
  18. while(!st.empty()){
  19. res += st.top();
  20. st.pop();
  21. }
  22. reverse(res.begin(), res.end());
  23. return res;
  24. }
  25. };

在第一次编写中,我没有判断栈是否为空,结果报错。

当栈为空时,调用 st.top() 会导致未定义行为,可能会导致程序崩溃。 

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

闽ICP备14008679号