代码随想录算法训练营第十天|LeetCode 232 用栈实现队列、LeetCode 225 用队列实现栈、LeetCode 20 有效的括号、LeetCode 1047 删除字符串中的所有相邻重复项
参考文章均来自代码随想录栈与队列理论文章链接LeetCode 232 用栈实现队列参考文章链接请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作push、pop、peek、empty实现 MyQueue 类void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空返回 true 否则返回 false说明你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque双端队列来模拟一个栈只要是标准的栈操作即可。、示例 1 输入 [MyQueue, push, push, peek, pop, empty] [[], [1], [2], [], [], []] 输出 [null, null, null, 1, 1, false] 解释 MyQueue myQueue new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false本题没什么算法 主要就是模拟 关键在于想到需要用两个栈解决一个栈无法实现队列功能另外一个关键是队列pop时 需将负责进队列的栈中的所有数据导入负责出队列的栈中否则会导致顺序出错classMyQueue{public:stackintstIn;stackintstOut;MyQueue(){}voidpush(intx){stIn.push(x);}intpop(){if(stOut.empty()){// 只有当stOut为空的时候再从stIn里导入数据,且要导入全部数据while(!stIn.empty()){stOut.push(stIn.top());stIn.pop();}}intresultstOut.top();stOut.pop();returnresult;}intpeek(){intresthis-pop();// 直接使用已有的pop函数stOut.push(res);// 因为pop函数弹出了元素res所以再添加回去returnres;}boolempty(){returnstIn.empty()stOut.empty();}};/** * Your MyQueue object will be instantiated and called as such: * MyQueue* obj new MyQueue(); * obj-push(x); * int param_2 obj-pop(); * int param_3 obj-peek(); * bool param_4 obj-empty(); */时间复杂度: 都为O(1)。pop和peek看起来像O(n)实际上一个循环n会被使用n次最后还是O(1)。空间复杂度: O(n)LeetCode 225 用队列实现栈参考文章链接使用队列实现栈的下列操作push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用 list 或者 deque双端队列来模拟一个队列 , 只要是标准的队列操作即可。你可以假设所有操作都是有效的例如, 对一个空的栈不会调用 pop 或者 top 操作。示例 输入 [MyStack, push, push, top, pop, empty] [[], [1], [2], [], [], []] 输出 [null, null, null, 2, 2, false] 解释 MyStack myStack new MyStack(); myStack.push(1); myStack.push(2); myStack.top(); // 返回 2 myStack.pop(); // 返回 2 myStack.empty(); // 返回 False本题使用两个和一个队列都可以实现 一个队列更加优化只需pop时将前面的元素重新写入队列后 获取队头元素弹出即可classMyStack{public:queueintque;MyStack(){}voidpush(intx){que.push(x);}intpop(){intique.size();i--;while(i--){que.push(que.front());que.pop();}intresque.front();que.pop();returnres;}inttop(){intsizeque.size();size--;while(size--){// 将队列头部的元素除了最后一个元素外 重新添加到队列尾部que.push(que.front());que.pop();}intresultque.front();// 此时获得的元素就是栈顶的元素了que.push(que.front());// 将获取完的元素也重新添加到队列尾部保证数据结构没有变化que.pop();returnresult;}boolempty(){returnque.empty();}};/** * Your MyStack object will be instantiated and called as such: * MyStack* obj new MyStack(); * obj-push(x); * int param_2 obj-pop(); * int param_3 obj-top(); * bool param_4 obj-empty(); */时间复杂度: pop为O(n)top为O(n)其他为O(1)空间复杂度: O(n)LeetCode 20 有效的括号参考文章链接给定一个只包括 ‘(’‘)’‘{’‘}’‘[’‘]’ 的字符串 s 判断字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例 1 输入s () 输出true 示例 2 输入s ()[]{} 输出true 示例 3 输入s (] 输出false 示例 4 输入s ([]) 输出true 示例 5 输入s ([)] 输出false本题为栈的典型应用 栈很适用于对称匹配的问题本题关键是找出不成功的情况 排除后最后栈内为空则返回true不匹配的情况如图截自代码随想录classSolution{public:boolisValid(string s){if(s.size()%2!0)returnfalse;stackcharst;for(inti0;is.size();i){if(s[i]()st.push());elseif(s[i][)st.push(]);elseif(s[i]{)st.push(});//情况二和情况三elseif(st.empty()||st.top()!s[i])returnfalse;elsest.pop();}returnst.empty();//情况一}};时间复杂度: O(n)空间复杂度: O(n)LeetCode 1047 删除字符串中的所有相邻重复项参考文章链接给出由小写字母组成的字符串 s重复项删除操作会选择两个相邻且相同的字母并删除它们。在 s 上反复执行重复项删除操作直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例 输入abbaca 输出ca 解释 例如在 abbaca 中我们可以删除 bb 由于两字母相邻且相同这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 aaca其中又只有 aa 可以执行重复项删除操作所以最后的字符串为 ca。栈为什么适合做这种类似于爱消除的操作因为栈帮助我们记录了 遍历当前元素时候前一个元素是什么。所以当相同时即可进行消除 非常方便注意最后结果是反的 要再反转一下classSolution{public:stringremoveDuplicates(string S){stackcharst;for(chars:S){if(st.empty()||s!st.top()){st.push(s);}else{st.pop();// s 与 st.top()相等的情况}}string result;while(!st.empty()){// 将栈中元素放到result字符串汇总resultst.top();st.pop();}reverse(result.begin(),result.end());// 此时字符串需要反转一下returnresult;}};时间复杂度: O(n)空间复杂度: O(n)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2457360.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!