赞
踩
题目链接/文章讲解/视频讲解:代码随想录
对栈的简单介绍:
在C++中,
stack
是标准模板库(STL)中提供的一种数据结构,表示栈(stack),它通常用于后进先出(LIFO)的数据管理。让我解释一下相关的操作:
stack.push(): 这个操作用于将元素压入栈顶(即入栈操作)。例如,如果你有一个
stack<int> st;
,你可以通过st.push(5);
将整数5
压入栈st
的顶部。stack.pop(): 这个操作用于从栈顶移除元素(即出栈操作)。例如,如果你有一个非空的栈
st
,通过st.pop();
将移除栈顶的元素。stack.top(): 这个操作返回栈顶元素的引用,但不会移除它。这可以让你访问栈顶的元素而不改变栈的内容。例如,如果你有一个栈
st
,你可以通过st.top();
来获取栈顶的元素值,而不会将其从栈中移除
思路:创建一个输入栈一个输出栈
- 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 result = stOut.top();
- stOut.pop();
- return result;
- }
-
- int peek() {
- int res = this -> pop();
- stOut.push(res);
- return res;
- }
-
- bool empty() {
- if(stOut.empty() && stIn.empty()){
- return true;
- }
- return false;
- }
- };

题目链接/文章讲解/视频讲解:代码随想录
思路:创建两个队列,一个用来备用。
- class MyStack {
- public:
- queue<int> que1;
- queue<int> que2;
-
- MyStack() {
-
- }
-
- void push(int x) {
- que1.push(x);
- }
-
- int pop() {
- int size = que1.size() - 1;
- while(size--){
- que2.push(que1.front());
- que1.pop();
- }
- int res = que1.front();
- que1.pop();
- que1 = que2;
- while(!que2.empty()){
- que2.pop();
- }
-
- return res;
- }
-
- int top() {
- return que1.back();
- }
-
- bool empty() {
- if(que1.empty()){
- return true;
- }
- return false;
- }
- };

第一次见到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
作为底层容器,以上述描述为准。
题目链接/文章讲解/视频讲解:代码随想录
思路:这道题目只需考虑所有不匹配的情况即可。一种是左括号多余,一种是括号匹配错误,一种是右括号多余。在代码中表现为,每遇到一个左括号,将一个相应的右括号入栈。每遇到一个右括号就和栈顶括号比是否相同,如果相同则将栈顶元素出栈。如果不同则说明匹配错误,返回false。如果栈为空,说明右括号多余,返回false。 将整个字符串遍历完后,检查栈是否为空,如果为空说明匹配正确,返回true(即st.empty())。 如果不为空,说明左括号多余,返回false(即st.empty())。
- class Solution {
- public:
- bool isValid(string s) {
- if(s.size() % 2 != 0){
- return false;
- }
- stack<int> st;
- for(int i = 0; i < s.size(); i++){
- if(s[i] == '('){
- st.push(')');
- }
- else if(s[i] == '{'){
- st.push('}');
- }
- else if(s[i] == '['){
- st.push(']');
- }
- else if(st.empty() || s[i] != st.top()){
- return false;
- }
- else{
- st.pop();
- }
- }
-
- return st.empty();
- }
- };

题目链接/文章讲解/视频讲解:代码随想录
思路:遍历字符串中的每个元素,如果与栈顶元素相同,就将栈顶元素出栈消除。如果不同则将该元素入栈。最后将栈中元素依次出栈存入字符串中,因为先入后出的缘故,需要反转字符串得到正确顺序。
- class Solution {
- public:
- string removeDuplicates(string s) {
- stack<int> st;
- for(int i = 0; i < s.size(); i++){
- if(st.empty()){
- st.push(s[i]);
- continue;
- }
- if(s[i] == st.top()){
- st.pop();
- }
- else{
- st.push(s[i]);
- }
- }
- string res = "";
- while(!st.empty()){
- res += st.top();
- st.pop();
- }
- reverse(res.begin(), res.end());
-
- return res;
- }
- };

在第一次编写中,我没有判断栈是否为空,结果报错。
当栈为空时,调用
st.top()
会导致未定义行为,可能会导致程序崩溃。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。