C语言用栈检查输入的符号是否合法的代码
时间: 2024-05-02 14:17:48 浏览: 55
检查字符串的合法性
以下是一个使用栈来检查输入符号是否合法的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_STACK_SIZE 100
// 定义栈结构体
typedef struct {
int top; // 栈顶指针
char items[MAX_STACK_SIZE]; // 栈元素数组
} Stack;
// 函数声明
void push(Stack *s, char item);
char pop(Stack *s);
bool is_empty(Stack *s);
bool is_full(Stack *s);
bool is_valid_expression(char *exp);
// 入栈操作
void push(Stack *s, char item) {
if (is_full(s)) {
printf("Stack overflow\n");
exit(EXIT_FAILURE);
}
s->items[++(s->top)] = item;
}
// 出栈操作
char pop(Stack *s) {
if (is_empty(s)) {
printf("Stack underflow\n");
exit(EXIT_FAILURE);
}
return s->items[(s->top)--];
}
// 判断栈是否为空
bool is_empty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
bool is_full(Stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 判断表达式是否合法
bool is_valid_expression(char *exp) {
Stack s;
s.top = -1; // 初始化栈
int i = 0;
char ch;
while ((ch = exp[i++]) != '\0') {
if (ch == '(' || ch == '[' || ch == '{') {
push(&s, ch);
} else if (ch == ')' || ch == ']' || ch == '}') {
if (is_empty(&s)) {
return false;
}
char top_ch = pop(&s);
if ((ch == ')' && top_ch != '(') || (ch == ']' && top_ch != '[') || (ch == '}' && top_ch != '{')) {
return false;
}
}
}
return is_empty(&s);
}
// 测试代码
int main() {
char exp[MAX_STACK_SIZE];
printf("Enter an expression: ");
scanf("%[^\n]s", exp);
if (is_valid_expression(exp)) {
printf("The expression is valid\n");
} else {
printf("The expression is not valid\n");
}
return 0;
}
```
这个代码中,我们定义了一个`Stack`结构体来表示栈,其中包含了一个`top`变量表示栈顶指针,以及一个`items`数组保存栈中的元素。我们还定义了一些函数来实现栈的基本操作,包括入栈、出栈、判断栈是否为空和是否已满。
在`is_valid_expression`函数中,我们使用了一个栈来检查给定的表达式是否合法。我们遍历字符串中的每个字符,如果遇到左括号,则将其入栈;如果遇到右括号,则从栈中弹出一个元素并检查它是否与当前右括号匹配。如果栈为空或者匹配失败,则表达式不合法。最后,如果栈为空,则表明所有的左括号都已经匹配成功,表达式合法。
在主函数中,我们读入一个表达式并调用`is_valid_expression`函数来检查其是否合法。如果合法,则输出提示信息;否则,输出错误信息。
阅读全文