用C语言写程序,设计一个算法,判断圆括号是否匹配正确,以@结束表达式,如果匹配输出圆括号对数,否则输出no,例如输入(a+b)/(c+d)@,输出2
时间: 2024-02-21 07:01:28 浏览: 52
设计一个算法判定一个算术表达式中的圆括号是否正确配....doc
好的,我可以为您提供一个基于栈的算法来解决这个问题。
算法思路如下:
1. 创建一个栈stack来存储左括号,初始为空。
2. 从输入中逐个读取字符,直到读取到字符@。
3. 如果当前字符是左括号(即 ( ),将其入栈。
4. 如果当前字符是右括号(即 ) ),则判断栈是否为空:
a. 如果栈为空,则说明没有左括号与之匹配,返回no。
b. 如果栈不为空,则将栈顶元素出栈,并判断其是否与当前右括号匹配:
i. 如果匹配,则继续扫描下一个字符。
ii. 如果不匹配,则返回no。
5. 如果读取完所有字符后,栈为空,则说明所有左括号都与右括号匹配了,输出匹配的对数即可。
6. 如果读取完所有字符后,栈不为空,则说明有左括号没有匹配到右括号,返回no。
下面是一个示例程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100
typedef struct {
char data[STACK_SIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isStackEmpty(Stack *s) {
return s->top == -1;
}
int isStackFull(Stack *s) {
return s->top == STACK_SIZE - 1;
}
void push(Stack *s, char c) {
if (isStackFull(s)) {
printf("Stack overflow.\n");
exit(1);
}
s->data[++(s->top)] = c;
}
char pop(Stack *s) {
if (isStackEmpty(s)) {
printf("Stack underflow.\n");
exit(1);
}
return s->data[(s->top)--];
}
int main() {
Stack s;
char c;
initStack(&s);
while ((c = getchar()) != '@') {
if (c == '(') {
push(&s, c);
} else if (c == ')') {
if (!isStackEmpty(&s) && pop(&s) == '(') {
continue;
} else {
printf("no\n");
return 0;
}
}
}
if (isStackEmpty(&s)) {
printf("%d\n", s.top + 1);
} else {
printf("no\n");
}
return 0;
}
```
希望这个算法和示例程序能够帮助到您!
阅读全文