栈
首先栈是一个线性表,是计算机用于暂时储存数据的地方,栈有一个特性就是只能从一头进行添加和删除,它就像一个空桶一样,放和取只能从桶的入口进行,最后放进去的东西会最先取出来,所以栈又称为后进先出的线性表。
C语言模拟栈
我们可以用结构体去模拟一个栈:
typedef struct {
int data[SIZE];
int top;
} Stack;
在这个结构体中,我们用data来模拟往栈里放的数据,data不一定是int类型,其他类型也可以。
top代表的是这个栈开口的地方,也就是data[top]始终为最后放入的元素。
栈的基本操作
- 初始化栈
- 入栈
- 出栈
- 获取栈顶元素
- 判断栈是否为空
- 清空栈
初始化栈
void initStack(Stack* stack) {
stack->top = -1;//将top赋值为-1,方便之后判断是否为空
}
入栈
void push(Stack* stack, int item) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack is full. Cannot push item.\n");
return;
}
stack->data[++stack->top] = item;
}
出栈
int pop(Stack* stack) {
if (stack->top == -1) {
printf("Stack is empty. Cannot pop item.\n");
return -1;
}
return stack->data[stack->top--];
}
获取栈顶元素
int peek(Stack* stack) {
if (stack->top == -1) {
printf("Stack is empty. Cannot peek item.\n");
return -1;
}
return stack->data[stack->top];
}
判断栈是否为空
int isEmpty(Stack* stack) {
return stack->top == -1;
}
清空栈
void clearStack(Stack* stack) {
stack->top = -1;
}
有效的括号
在力扣做了一道题,题目叫有效的括号。这道题我使用了模拟栈的思想做了出来。
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s =
"()"
输出:true
示例 2:
输入:s =
"()[]{}"
输出:true
示例 3:
输入:s =
"(]"
输出:false
提示:
- 1 <= s.length <= 104
- s 仅由括号
'()[]{}'
组成
这个问题就可以使用栈来解决。
- 创建一个空栈。
- 遍历字符串 s 中的每个字符:
- 如果当前字符是左括号(‘(’,‘{’,‘[’),将其推入栈中。
- 如果当前字符是右括号(‘)’,‘}’,‘]’),执行以下步骤:
- 如果栈为空,或者栈顶元素不是对应的左括号,则返回 False,因为没有正确的左括号与当前右括号匹配。
- 如果栈顶元素是对应的左括号,则将栈顶元素弹出,继续遍历下一个字符。
- 在遍历完字符串 s 后,如果栈为空,说明所有括号都有正确的闭合对应关系,返回 True;否则,返回 False,因为还有未闭合的左括号。
我的解答是:
char pair(char ch)
{
if(ch == '(') return ')';
if(ch == '{') return '}';
if(ch == '[') return ']';
return 0;
}
typedef struct
{
char data[5000];
int top;
}Stack;
void initStack(Stack* stack)
{
stack->top = -1;
}
void push(Stack* stack, char ch)
{
if(stack->top == 4999)
{
return;
}
stack->data[++stack->top] = ch;
}
char pop(Stack* stack)
{
if(stack->top == -1)
return -1;
return stack->data[stack->top--];
}
bool isValid(char* s) {
int length = strlen(s);
if(length % 2 == 1)
return false;
Stack stack;
initStack(&stack);
for(int i = 0; i < length; i++)
{
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
{
push(&stack, s[i]);
}
if(s[i] == ')' || s[i] == ']' || s[i] == '}')
{
if(pair(pop(&stack)) != s[i])
{
return false;
}
}
}
return stack.top == -1;
}