括号匹配

C/C++ code
   
   
#include < stdio.h > #include < stdlib.h > #include < string .h > #include < malloc.h > #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 // 存储空间分配增量 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef char SElemType; typedef struct { SElemType * base ; // 在栈构造之前和销毁之后,base的值为NULL SElemType * top; // 栈顶指针 int stacksize; // 当前已分配的空间,以元素为单位 }SqStack; Status InitStack (SqStack & S) { // 构造一个空栈 S. base = (SElemType * ) malloc(STACK_INIT_SIZE * sizeof (SElemType)); if ( ! S. base ) exit(OVERFLOW); // 存储分配失败 S.top = S. base ; S.stacksize = STACK_INIT_SIZE; return OK; } // InitStack Status Push(SqStack & S, SElemType e) { if (S.top - S. base >= S.stacksize) { // 栈满,追加存储空间 S. base = (SElemType * ) realloc(S. base , (S.stacksize + STACKINCREMENT) * sizeof (SElemType)); if ( ! S. base ) exit(OVERFLOW); S.top = S. base + S.stacksize; S.stacksize += STACKINCREMENT; } // 插入元素为e的新的栈顶元素 * S.top = e; S.top ++ ; return OK; } // Push Status Pop (SqStack & S, SElemType & e) { // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if (S.top == S. base ) return ERROR; S.top -- ; e = * S.top; return OK; } // Pop // 堆栈是否为空 Status StackEmpty(SqStack S){ if (S.top != S. base ) return ERROR; return OK; } Status bracket(SqStack & S, char * s) { char * p; p = s; int flag = 0 , flag2; SElemType e; while ( p != ' \0 ' ) { switch ( * p) { case ' ( ' : Push(S, ' ( ' ); break ; case ' [ ' : Push(S, ' [ ' ); break ; case ' ) ' : { Pop(S,e); if (e != ' ( ' ) flag = 1 ; printf( " 测试:%d\n " ,flag); break ; } case ' ] ' : { Pop(S,e); if (e != ' [ ' ) flag = 1 ; printf( " 输出: %c\n " ,e); break ; } default : break ; } if (flag) break ; p ++ ; } flag2 = StackEmpty(S); if ( ! flag && flag2) printf( " 括号匹配\n " ); else printf( " 括号不匹配\n " ); return OK; } void main () { int flag = 1 ; char temp; while (flag == 1 ) { char str[ 200 ]; SqStack S; printf( " 请输入字符串: " ); scanf( " %s " ,str); InitStack(S); bracket(S,str); printf( " 继续请输入1,停止请输入0: " ); scanf( " %d " , & flag); printf( " \n " ); } }

假设表达式中包含两种括号:圆括号和方括号,其嵌套顺序随意,即([]())或[([])]等为正确的格式,[(])或([())或(()]均为不正确的格式。
下面为运行的情况:

请输入字符串:[()]
测试:0
输出: [
测试:0
测试:1
括号不匹配
继续请输入1,停止请输入0:

请大家给点建议呀,是在是检查不出来下面这句话有什么问题:
case ')' : {  
Pop(S,e);
if(e != '(') flag = 1;  
printf("测试:%d\n",flag);
break;
}
且会无缘无故多输出下面的内容来:
测试:0
测试:1
好的,以下是使用 C++ 实现检验表达式括号是否匹配的代码: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; bool is_matching(char opening, char closing) { return (opening == '(' && closing == ')') || (opening == '[' && closing == ']'); } bool is_balanced(string expression) { stack<char> s; for(char& c : expression) { if(c == '(' || c == '[') { s.push(c); } else if(c == ')' || c == ']') { if(s.empty() || !is_matching(s.top(), c)) { return false; } s.pop(); } } return s.empty(); } int main() { string expression1 = "([)]"; string expression2 = "[()]{}{[()()]()}"; if(is_balanced(expression1)) { cout << expression1 << " is balanced." << endl; } else { cout << expression1 << " is not balanced." << endl; } if(is_balanced(expression2)) { cout << expression2 << " is balanced." << endl; } else { cout << expression2 << " is not balanced." << endl; } return 0; } ``` 在这个实现,我们定义了两个函数。`is_matching` 函数用于判断两个括号是否匹配,`is_balanced` 函数用于检查表达式的所有括号是否匹配。我们使用一个字符栈来存储括号,并在遇到闭括号时弹出相应的开括号。如果遇到不匹配的括号或者字符栈为空而表达式还未结束的情况,就说明表达式括号不匹配。 在 `main` 函数,我们定义了两个表达式,分别检查它们是否匹配。您可以根据需要修改 `expression1` 和 `expression2` 变量来尝试不同的输入值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值