KEY
(1)STL有关栈和队列的函数
1>stack基础函数:
push
top:读取并返回队元素
pop:出栈栈顶元素,返回值为空
empty:返回布尔值,是否为空
size:返回元素个数
2>queue基础函数:
push
pop:出栈栈顶元素,返回值为空
front:读取并返回队首元素
back:返回队尾元素
empty:返回布尔值,是否为空
size:返回元素个数
3>string基础函数
| 函数 | 用途 | 示例 |
|---|---|---|
push_back(c) | 在末尾添加字符 | s.push_back('!');→ “Hello!” |
pop_back() | 删除末尾字符 | s.pop_back(); |
front() | 返回第一个字符 | s.front(); |
back() | 返回最后一个字符 | s.back(); |
empty() | 判断是否为空字符串 | s.empty();→false |
clear() | 清空字符串 | s.clear(); |
232.用栈实现队列
(1)思路没啥,注意理清关系
思路:两个栈实现队列
(2)cppSTL有关栈的函数和相关细节
整个代码:
class MyQueue{public:stack<int>stIn;stack<int>stOut;MyQueue(){}voidpush(intx){//把数据压入stInstIn.push(x);}intpop(){//如果stOut是空的,把所有stIn的数据压入//如果不是空的,stOut.popif(stOut.empty()){while(!stIn.empty()){stOut.push(stIn.top());stIn.pop();}}intresult=stOut.top();stOut.pop();returnresult;}intpeek(){inttemp=this->pop();stOut.push(temp);returntemp;}boolempty(){returnstIn.empty()&&stOut.empty();}};225. 用队列实现栈
思路还好,看看吧。
思路:一个队列,入栈直接加入队列,出栈先将队列除了最后一个元素出队再入队,然后出队最后一个元素
整个代码:
class MyStack{public:queue<int>que;MyStack(){}voidpush(intx){que.push(x);}intpop(){intsize=que.size();inttemp;while(size>1){temp=que.front();que.pop();que.push(temp);size--;}temp=que.front();que.pop();returntemp;}inttop(){returnque.back();}boolempty(){returnque.empty();}};20. 有效的括号
思路还好。思路:构造一个栈放这些括号。
注意逻辑简洁的代码,如下:
整个代码:
class Solution{public:boolisValid(string s){stack<char>st;for(inti=0;i<s.size();i++){if(s[i]=='('){st.push(')');}elseif(s[i]=='['){st.push(']');}elseif(s[i]=='{'){st.push('}');}elseif((!st.empty())&&s[i]==st.top()){st.pop();}else{returnfalse;}}//需要判断栈空,才可以说是有效字符串(因为可能全是左括号,不段压入)returnst.empty();}};1047. 删除字符串中的所有相邻重复项
(1)思路:用栈解决很方便,或者在字符串中直接模拟栈(更快)
(2)cpp关于string的函数
| 函数 | 用途 | 示例 |
|---|---|---|
push_back(c) | 在末尾添加字符 | s.push_back('!');→ “Hello!” |
pop_back() | 删除末尾字符 | s.pop_back(); |
front() | 返回第一个字符 | s.front(); |
back() | 返回最后一个字符 | s.back(); |
empty() | 判断是否为空字符串 | s.empty();→false |
clear() | 清空字符串 | s.clear(); |
整个代码:
(1)栈:
class Solution{public:stringremoveDuplicates(string s){stack<char>st;for(inti=0;i<s.size();i++){if(st.empty()||s[i]!=st.top()){st.push(s[i]);}else{st.pop();}}//return the resultstring result="";while(!st.empty()){chartemp=st.top();//别忘了出栈st.pop();result+=temp;}reverse(result.begin(),result.end());returnresult;}};(2)在字符串中模拟栈:
class Solution{public:stringremoveDuplicates(string s){string result;for(inti=0;i<s.size();i++){if(result.empty()||s[i]!=result.back()){result.push_back(s[i]);}else{result.pop_back();}}returnresult;}};详细信息
理论基础
了解一下 栈与队列的内部实现机制,文中是以C++为例讲解的。
文章讲解:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
232.用栈实现队列
大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html
225. 用队列实现栈
可能大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。
建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解
题目链接/文章讲解/视频讲解:https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html
20. 有效的括号
讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。
大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
1047. 删除字符串中的所有相邻重复项
栈的经典应用。
要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。
题目链接/文章讲解/视频讲解:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html