一、实现代码
#include <iostream>
#define MAXSIZE 100
using namespace std;
struct stack {
int* base;
int* top;
int stacksize;
stack() { base = new int[MAXSIZE]; top = base; stacksize = MAXSIZE; }
//压入——top所指位置赋值,top++
int push(int elem) {
if (top - base == stacksize)
return -1;
else {
*top = elem;
top++;
}
}
//弹出——top--
int pop() {
if (top == base)
return -1;
else
top--;
}
//获取栈顶——获取top-1的元素
int Top() {
if (top == base)
return -1;
else
return *(top - 1);
}
//判断是否栈空
int empty() {
if (top == base)
return 1;
else
return 0;
}
//获取栈大小
int size() {
return top - base;
}
};
int main() {
//1、申请栈
stack s;
//2、压入元素
s.push(5);
s.push(2);
s.push(0);
//3、获取栈的大小
cout << "The length of stack is:" << s.size() << '\n';
//4、弹出栈
while (!s.empty()) {
cout << s.Top() << '\t'; s.pop();
}
}
二、高频题目
232. 用栈实现队列——两个栈,取栈底,取完恢复
0、申请两个栈stack1,stack2
1、压入——压入stack1
2、弹出——取stack1栈底,弹出stack2栈顶,取完剩余元素放回stack1
3、取栈顶——取stack1栈顶,取完全部元素放回stack1
4、判空——stack1 stack2同时为空
150. 逆波兰表达式求值——栈解决问题
1、遇到数字直接压入栈
2、遇到符号,取出栈顶两个元素,进行运算,并将结果压入
3、返回栈顶,即运算结果
20. 有效的括号——栈解决问题
1、遇到左括号直接压入
2、栈当前为空 证明无左括号与接下来的右括号匹配 直接返回false
3、遇到右括号,判断栈顶是否为对应的左括号,是则弹出,否则返回false
1472. 设计浏览器历史记录——两个栈解决,向量模拟栈解决(更快)
1、申请vector和一个top指针模拟栈
2、压入——cur指针前移,top指针更新,判断cur是否超出stack的存储大小
3、后退——cur取 0 与 cur-steps的较小值
4、前进——cur取 top 与 cur+steps的较大值
1209. 删除字符串中的所有相邻重复项 II——两个栈解决
0、 一个存储字母letter,一个存储相同字母的连续出现次数count
1、当前元素与栈顶相同,连续出现次数+1,判断是否等于k
( 1.1、等于则弹出 1.2、不等则插入)
2、当前元素与栈顶不相同,元素插入letter,1插入count
1249. 移除无效的括号——一个符号栈sign,一个stirng ans
1、遍历字符串,遇到左括号入栈,加入ans
2、遇到右括号,判断栈有无左括号进行匹配,有则弹出左括号,加入ans
3、遇到字母,直接加入ans
4、获取sign的size,为0则直接返回ans,否则进行逆序左括号删除
(逆序左括号删除可以保证迭代器不失效,且左括号无论出现再开头还是结尾都可正确被删除)
735. 行星碰撞——栈解决问题
1、遇到正数直接入栈
2、遇到负数不发生碰撞——栈为空 或 stack.top()<0
3、遇到负数发生碰撞——stack.top()>0
3.1、item大于top,stack.pop()——item大于/等于/小于top,不发生碰撞
3.2、item等于top,stack.pop()
3.3、item小于top,直接不处理
4、stack转vector再反转
224. 基本计算器——利用栈处理括号,ops.push(1),sign=1
1、跳过空格
2、遇到+/-,更新当前数字的符号,(+/-)*sign.top();
3、遇到‘(’,ops.push(sign)
4、遇到’)’,ops.pop()
5、遇到数字进行整合,ans+=sign x num
6、返回ans
三、思考与收获
1、何时使用栈?
1)括号匹配题
2)中间元素不断被消除
3)重复相邻元素
4)表达式求值
2、使用栈需要注意什么?
注意栈为空的时候,不能进行top pop的操作
循环不断pop的操作,循环条件一定要记得判 !stack.empty()