c语言利用链式栈实现,给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。测试数据有多组,处理到输入结束。 样例输入: sin(10+20) {[}] 样例输出: yes
时间: 2024-11-30 22:21:50 浏览: 5
AntiAlias-Project,c语言数字转字符串函数源码,c语言程序
C语言中可以使用链表结构以及一个栈来解决这个问题,因为栈的数据结构特性恰好适合于检查括号的配对。我们将创建一个链表节点,每个节点包含一个字符和一个指向下一个节点的指针。当遍历输入字符串时,遇到左括号(如'('、'['或'{'}),我们将其添加到链表的顶部;遇到右括号时,我们尝试从栈顶弹出一个左括号,并比较它们是否匹配。如果匹配,继续处理;如果不匹配,或者栈为空,则返回"no"。
下面是一个简单的伪代码描述:
```c
typedef struct Node {
char character;
struct Node* next;
} StackNode;
StackNode* createNode(char ch) {
StackNode* newNode = (StackNode*)malloc(sizeof(StackNode));
newNode->character = ch;
newNode->next = NULL;
return newNode;
}
void push(StackNode** stack, char ch) {
if (*stack == NULL) {
*stack = createNode(ch);
} else {
StackNode* newNode = createNode(ch);
newNode->next = *stack;
*stack = newNode;
}
}
int isMatch(StackNode* top, char ch) {
switch (ch) {
case ')':
return (*top && top->character == '(');
case ']':
return (*top && top->character == '[');
case '}':
return (*top && top->character == '{');
default:
return true; // 非括号字符无需匹配
}
}
bool checkBrackets(char input[]) {
StackNode* stack = NULL;
for (char ch : input) {
if (isalpha(ch) ||.isdigit(ch) || ispunct(ch)) { // 非括号字符直接忽略
continue;
}
if (ch == '(' || ch == '[' || ch == '{') {
push(&stack, ch);
} else if (stack && isMatch(stack, ch)) {
pop(stack); // 匹配成功,弹出栈顶元素
} else {
return false; // 不匹配,提前返回
}
}
// 如果到达这里,表示所有左括号都有匹配的右括号,返回true
return stack == NULL;
}
```
阅读全文