一. 栈
1.1 基本概念
栈是只允许在一端进行插入或删除操作的线性表
- 栈顶:线性表允许进行插入或删除的那一端
- 栈底:固定的, 不允许进行插入和删除的那一端
- 空栈:不含任何元素的空表
栈的操作特性可以概括为后进先出
1.2 基本操作
- 初始化一个空栈
initStack
- 判断一个栈是否为空,栈为空返回 true,否则返回 false
empty
- 进栈,若栈未满,将元素 value 加入成为新的栈顶元素
push
- 出栈,若栈非空,则弹出栈顶元素
pop
- 读栈顶元素,若栈非空,则用 x 返回栈顶元素
getTop
- 销毁栈
destoryStack
1.3 栈的顺序存储结构
typedef struct{
int *data;
int capacity;
int top;
}Stack;
int initStack(Stack *stack, int capacity){
if(stack == NULL)
return -1;
stack->data = (int *)calloc(capacity, sizeof(int));
stack->capacity = capacity;
stack->top = -1;
return 0;
}
int destoryStack(Stack *stack){
if(stack == NULL || stack->data == NULL)
return -1;
free(stack->data);
return 0;
}
int empty(Stack *stack){
if(stack->top == -1)
return 1;
return 0;
}
int push(Stack *stack, int val){
if(stack == NULL || stack->data == NULL)
return -1;
if(stack->top == stack->capacity - 1){
stack->data = realloc(stack->data, 2 * stack->capacity * sizeof(int));
stack->capacity *= 2;
}
stack->data[++stack->top] = val;
return 0;
}
int getTop(Stack *stack, int *val){
if(stack == NULL || stack->data == NULL || stack->top == -1)
return -1;
*val = stack->data[stack->top];
return 0;
}
int pop(Stack *stack){
if(stack == NULL || stack->data == NULL || stack->top == -1)
return -1;
--stack->top;
return 0;
}
作业
1. 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1: 输入: “()” 输出: true
示例 2: 输入: “()[]{}” 输出: true
示例 3: 输入: “(]” 输出: false
示例 4: 输入: “([)]” 输出: false
示例 5: 输入: “{[]}” 输出: true
2. 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
3. 编写函数,将由小写字母表示的中缀表达式转换为后缀表达式
示例:
输入:“(a+b)*c”
输出:“ab+c*”
4. 根据逆波兰表示法,求表达式的值。
有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入: [“2”, “1”, “+”, “3”, “*”]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入: [“4”, “13”, “5”, “/”, “+”]
输出: 6
解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
5. 请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。