一刷代码随想录——栈和队列
创始人
2024-05-22 22:08:09
0

1 理论基础

栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。

我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。

栈不提供走访功能,也不提供迭代器(iterator)

std::stack > third;  // 使用vector为底层容器的栈

队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构。

std::queue> third;     // 定义以list为底层容器的队列

2 力扣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(双端队列)来模拟一个栈,只要是标准的栈操作即可。

class MyQueue {
public:stack stIn;stack stOut;/** Initialize your data structure here. */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() {return stIn.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();*/

3 力扣225. 用队列实现栈

题目描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。

int pop() 移除并返回栈顶元素。

int top() 返回栈顶元素。

boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。

你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

class MyStack {
public:queue que;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {que.push(x);}//相当于左旋队列int pop() {int size = que.size();size--;while (size--) {que.push(que.front());que.pop();}int result = que.front(); que.pop();return result;}/** Get the top element. */int top() {return que.back();}/** Returns whether the stack is empty. */bool empty() {return que.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();*/

4 力扣20. 有效的括号

题目描述:

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。

class Solution {
public:bool isValid(string s) {if (s.size() % 2 != 0) return false;stackst;char r;for (int i = 0; i < s.size(); ++i) {if (st.empty() && (s[i] == ')' || s[i] == ']' || s[i] == '}')) return false;if (s[i] == '(' || s[i] == '[' || s[i] == '{') st.push(s[i]);else if (s[i] == ')') {if (st.top() != '(') return false;else st.pop();}else if (s[i] == ']') {if (st.top() != '[') return false;else st.pop();}else if (s[i] == '}') {if (st.top() != '{') return false;else st.pop();}}return st.empty();}
};

5 力扣150. 逆波兰表达式求值

题目描述:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

有效的算符为 '+'、'-'、'*' 和 '/' 。

每个操作数(运算对象)都可以是一个整数或者另一个表达式。

两个整数之间的乘法总是 向零截断 。

表达式中不含除零运算。

输入是一个根据逆波兰表示法表示的算术表达式。

答案及所有中间计算结果可以用 32 位 整数表示。

适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

class Solution {
public:int evalRPN(vector& tokens) {stack st;for (int i = 0; i < tokens.size(); i++) {if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {int num1 = st.top();st.pop();int num2 = st.top();st.pop();if (tokens[i] == "+") st.push(num2 + num1);if (tokens[i] == "-") st.push(num2 - num1);if (tokens[i] == "*") st.push(num2 * num1);if (tokens[i] == "/") st.push(num2 / num1);} else {st.push(stoi(tokens[i]));}}int result = st.top();st.pop();return result;}
};

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。

该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波兰表达式主要有以下两个优点:

去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

6 力扣239. 滑动窗口最大值

题目描述:

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

7 力扣347.前 K 个高频元素

题目描述:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

8.力扣42.接雨水

题目描述:

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

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

题目描述:

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

class Solution {
public:string removeDuplicates(string S) {string result;for(char s : S) {if(result.empty() || result.back() != s) {result.push_back(s);}else result.pop_back();}return result;}
};

相关内容

热门资讯

小草像什么比喻句 小草像什么比喻句大全  春天来了,小草像春笋一般露出了绿芽,小编收集了小草像什么的比喻句,欢迎阅读。...
激发学生作文兴趣的方法 激发学生作文兴趣的方法  作文教学历来是语文教学的半壁河山,在作文教学中,培养学生自主学习能力,让合...
虎年春节对联 虎年春节对联(精选230副)  在快速变化和不断变革的`今天,大家或多或少都接触过一些对联吧,对联是...
小小消防员作文700字 小小消防员作文700字  11月9日是全国消防安全教育日,为了提高我们的消防安全意识,宣城日报小记者...
描写春天的比喻句 描写春天的比喻句(精选60句)  春天像辛勤的园丁,精心的呵护着花草,让它们茁壮生长。下面是小编帮大...
老子简介 老子简介  简介,即简明扼要的介绍。是当事人全面而简洁地介绍情况的一种书面表达方式,它是应用写作学研...
写作叙述方法之分叙法 写作叙述方法之分叙法  分叙法是指叙述两件或两件以上的同一时间内不同地点发生的事情,也叫平叙法。以下...
匆匆仿写作文 匆匆仿写作文(精选30篇)  作文,就是将生活中的见闻、感受描绘出来,将对生活的想像与思考表达出来,...
中国文学常识 中国文学常识大全  常识,一般指从事各项工作以及进行学术研究所需具备的相关领域内的基础知识。下面是小...
佛寺庙宇对联 佛寺庙宇对联(精选70句)  寺庙对联内容丰富,言简意赅。是我国佛教文化重要组成部分,也是我国寺庙不...
中国四大名著文学常识 中国四大名著文学常识  中国四大名著是指《水浒传》《三国演义》《西游记》《红楼梦》(按照成书先后顺序...
圆明园祭阅读答案   (1)那天很冷,我却刻意要到圆明园去。朋友们都劝说,圆明园没有什么可看的,只是几块烂石头,我说,...
秋后的蚂蚱歇后语是什么   歇后语是我国人民在生活实践中创造的一种特殊语言形式。它一般由两个部分构成,前半截是形象的比喻, ...
教师节对联 教师节对联(精选55句)  在社会一步步向前发展的'今天,大家总少不了接触一些耳熟能详的对联吧,对联...
新年的对联 新年的对联(精选115句)  在现在的社会生活中,大家都经常接触到对联吧,对联作为一种习俗,是汉族传...
描写天气谚语 描写天气谚语大全  在平凡的学习、工作、生活中,大家都有令自己印象深刻的谚语吧,谚语是劳动人民的生活...
雷声大雨点小歇后语是什么   雷声大雨点小——(虚张声势):比喻做起事来声势造得很大,实际行动却很少。  雷声大,雨点小 : ...
小学优秀班主任事迹材料 小学优秀班主任事迹材料(精选11篇)  根据自己的兴趣爱好,成立活动小组,再聘请相关学科老师为指导教...
王羲之兰亭序全文及译文 王羲之兰亭序全文及译文  永和九年,岁在癸丑,暮春之初,会于会稽山阴之兰亭,修稧事也。下面是小编为你...
仰仗是褒义词吗 仰仗是褒义词吗  仰仗常指事物的根基状态,依靠;依赖,我们看看下面的相关资料吧!  仰仗是褒义词吗?...