前言
这是六月集训的第十四日,今日的训练内容是 栈
解题报告
1.力扣剑指 Offer 31. 栈的压入、弹出序列
原题链接
题目概述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
解题思路
定义一个辅助的栈用于按照题目的要求进行压栈,然后每当 popped 数组的元素与栈顶元素相等的时候,就出栈,并且移动指向 popped 数组的指针,如果最后压栈全部都结束了仍然有没有出栈的元素在,那么就说明不能满足条件,因此只需要看栈顶指针是否为 0 即可。
值得注意的一点是:在内部的 while()
循环的判断条件处,一定要把 top 写在前面,这样当 top 为 0 时直接就不会进行后面的判断,也就可以避免了数组下标越界的问题了。
源码剖析
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
int* stack = (int *) malloc (sizeof(int) * pushedSize); //定义一个辅助栈
int top = 0, i = 0, j = 0;
while(i < pushedSize) {
stack[top++] = pushed[i++];
while(top&&popped[j]==stack[top-1]){
++j;
--top;
}
}
return !top;
}
2.力扣946
原题链接
题目概述
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
解题思路
和上一题一模一样,直接复用一下就可以了。
源码剖析
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
int* stack = (int *) malloc (sizeof(int) * pushedSize); //定义一个辅助栈
int top = 0, i = 0, j = 0;
while(i < pushedSize) {
stack[top++] = pushed[i++];
while(top&&popped[j]==stack[top-1]){
++j;
--top;
}
}
return !top;
}
3.力扣856
原题链接
题目概述
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
- () 得 1 分。
- AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
- (A) 得 2 * A 分,其中 A 是平衡括号字符串。
解题思路
这题还是直接使用递归做比较方便,遇到右括号时就等于 1 假如已经有 1 了就乘 2 ,每次碰到左括号就直接新加一层递归。
源码剖析
int GetScore(char **S)
{
int score = 0;
while (**S != '\0') {
if (**S == '(') {
*S += 1;
score += GetScore(S);
} else {
*S += 1;
score *= 2;
return (score == 0) ? 1 : score;
}
}
return score;
}
int scoreOfParentheses(char *S)
{
return GetScore(&S);
}
4.力扣1190
原题链接
解题思路
记录一下明日写