请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。 输出格式: 首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。
时间: 2025-03-19 08:12:01 浏览: 64
这是一个经典的栈应用问题,可以利用栈的数据结构特性来解决括号匹配的问题。以下是具体的解决方案及其实现思路:
### 思路分析
1. **数据结构选择**:使用栈(Stack),因为括号的配对遵循“后进先出”的规则,非常适合用栈实现。
2. **处理流程**:
- 遍历输入的所有字符;
- 如果遇到左符号(`/*`, `(`, `[`, `{`),将其压入栈中;
- 如果遇到右符号(`*/`, `)`, `]`, `}`),则检查栈顶元素是否为对应的左符号:
- 若匹配成功,则将栈顶弹出;
- 否则记录错误信息并停止进一步检测;
3. 输入结束后,若栈非空,则表示有未匹配的左符号。
---
### 程序实现
```c
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // 栈的最大容量
typedef struct {
char data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void init_stack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty(Stack *s) {
return s->top == -1;
}
// 入栈操作
void push(Stack *s, char c) {
if (s->top + 1 >= MAX_SIZE) {
printf("Stack overflow\n");
return;
}
s->data[++(s->top)] = c;
}
// 出栈操作
char pop(Stack *s) {
if (is_empty(s)) {
return '\0';
}
return s->data[(s->top)--];
}
// 获取栈顶元素
char peek(Stack *s) {
if (is_empty(s)) {
return '\0';
}
return s->data[s->top];
}
// 检查两个符号是否匹配
int match(char left, char right) {
if ((left == '(' && right == ')') ||
(left == '[' && right == ']') ||
(left == '{' && right == '}')) {
return 1;
}
return 0;
}
int main() {
Stack stack;
init_stack(&stack);
char line[256]; // 假设每行最多256个字符
int error_flag = 0; // 错误标志
char first_mismatch_left = '?'; // 第一个不匹配的左符号
char first_mismatch_right = '?'; // 第一个不匹配的右符号
while (fgets(line, sizeof(line), stdin)) {
// 如果只有一行"."结束循环
if (line[0] == '.' && strlen(line) == 2) break;
for (int i = 0; line[i] != '\0'; ++i) {
char ch = line[i];
// 左符号直接入栈
if (ch == '(' || ch == '[' || ch == '{') {
push(&stack, ch);
} else if (ch == ')' || ch == ']' || ch == '}') { // 右符号尝试匹配
char top_ch = peek(&stack);
if (!match(top_ch, ch)) {
// 匹配失败
error_flag = 1;
first_mismatch_right = ch;
goto END_CHECKING; // 直接退出内层循环
} else {
// 匹配成功,出栈
pop(&stack);
}
}
}
}
END_CHECKING:
if (error_flag) {
// 缺少左符号的情况
printf("NO\n?-%c\n", first_mismatch_right);
} else if (!is_empty(&stack)) {
// 缺少右符号的情况
printf("NO\n%c-?\n", peek(&stack));
} else {
// 完全匹配
printf("YES\n");
}
return 0;
}
```
---
### 测试样例
#### 输入示例 1:
```
if(a<b)
{
printf("a=%d,b=%d",a,b);
}
.
```
#### 输出示例 1:
```
YES
```
#### 输入示例 2:
```
if(a<b){
printf("a=%d,b=%d",a,b);
}.
```
#### 输出示例 2:
```
NO
?-]
```
#### 输入示例 3:
```
if(a<b[
printf("a=%d,b=%d",a,b);
].
```
#### 输出示例 3:
```
NO
[-?
```
---
### §相关问题§:
1. 栈还有哪些典型的应用场景?
2. 如果需要支持更多的特殊符号,比如 HTML 的 `<tag>` 和 `</tag>`,如何修改上述算法?
3. 是否可以用其他数据结构代替栈完成此任务?如果有,请举例说明优缺点。
阅读全文
相关推荐














