力扣第二十题题解
数据结构——栈
前言
程序 = 数据结构 + 算法
一、栈的定义
栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
在这里插入图片描述
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构
二、栈的操作
栈的初始化
进栈(也称压栈、入栈)
出栈(也称弹栈)
取栈顶元素
清空栈销毁栈
题解
力扣第20题——有效的括号
力扣第20题对新手来说是一相对较简单的题目(至少对于新手来说能看懂题目了)
题目要求我们检查括号的有效性,即每一个括号都能和相应的括号对上,而且不能错位,即( ) [ ] { }是合法的,( [ ] ) { }是合法的,[ ( [ ] { } ) ]也是合法的,但( [ ) ]是非法的。
bool isValid(char* s) {
if (strlen(s) & 0x01) { // 按位与运算,等价于strlen(s) % 2 != 0
return false;
// 如果说这个字符串的长度是偶数,则这个字符串一定非法,直接排除,减少代码的遍历次数
} else {
char stack[10000]; // 一个栈,要求足够大,否则测试案例90过不去
int top = 0; // 栈顶,标记,也是我们解题的关键
for (int i = 0; s[i] != '\0'; i++) {
switch (s[i]) {
// 判断字符,左括号入栈,右括号出栈
case '(':
stack[++top] = ')'; // 这里设置成右括号,方便之后比较
// 这里必须先自增,因为top是一个标记
/* 等价于top++;
stack[top] = ')'; */
break;
case ')':
if (s[i] != stack[top]) {
return false;
} else {
top--;
}
break;
case '[':
stack[++top] = ']'; // 同上
break;
case ']': // 同上
if (s[i] != stack[top]) {
return false;
} else {
top--;
}
break;
case '{':
stack[++top] = '}'; // 同上
break;
case '}': // 同上
if (s[i] != stack[top]) {
return false;
} else {
top--;
}
break;
}
}
// 判断栈顶是否为零,为零则证明合法
if (top) {
return false;
} else {
return true;
}
}
}