完成题目:
- LeetCode 20、有效的括号
- LeetCode 155、最小栈
- LeetCode 150、逆波兰表达式求值
先简单回顾一下栈的知识点:
1、先进后出(以下题目基本是运用了此特性)
2、基本操作如:pop():弹出最后一个置入的元素(没有返回值!!!)
push():入栈操作
top():访问栈顶元素
empty():判断栈是否为空
给出例题:
获取栈中最小的元素:
解法一:
使用一个辅助栈,普通栈正常压入、弹出,辅助栈在压入时须比较 辅助栈上置顶的值 与 压入数大小,并将小的压入,此时记录的就是此位置以下最小的值
解法二:
差值法:
压栈时:
1、一开始即栈为空时直接记min ,并压入 0;
2、当差值为负值时,先压入负值,再更新min值
出栈时:
>0,正常计算复原值,正常弹出
<0,top()取min值,弹出时需计算min值
附上代码:
class MinStack {
stack<long> x_stack;
long min;
public:
MinStack() {
return ;
}
void push(int val) {
if(x_stack.empty())
{
min=val;
x_stack.push(0);
}
else
{
long temp=val-min;
x_stack.push(temp);
if(temp<0)
min=val;
}
}
void pop() {
if(x_stack.top()<0)
{
min-=x_stack.top();
}
x_stack.pop();
}
int top() {
if(x_stack.top()<0)
return min;
else
return x_stack.top()+min;
}
int getMin() {
return min;
}
};
LeetCode 20、有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
此题需结合哈希表写,因为每一对括号都是相匹配的
unordered_map<char,char> Hashmap
{{'(',')'},{'{','}'},{'[',']'},{'?','?'}};
为了使题更加好判断,选择加入“?”入栈,最后如果不是?结尾,必定不完全匹配
给出代码:
class Solution {
public:
bool isValid(string s)
{
//建立一个哈希表,进行匹配
unordered_map<char,char> Hashmap
{{'(',')'},{'{','}'},{'[',']'},{'?','?'}};
stack<int> st;
st.push('?');
for(char c:s)
{
//不为0说明哈希表可以匹配 只有为前半括号时
if(Hashmap[c] != 0 )
st.push(c);
//当后半括号出现时,必须是匹配最近也就是栈顶的括号
else if(c==Hashmap[st.top()])
st.pop();
//其他情况必定不能匹配了
else
return false;
}
if(st.top()=='?')
return true;
else return false;
}
};