栈的实际应用很多,其中括号匹配是很常见的例子。下面列出基本算法和源代码,标明注释以便日后复习和翻阅。
Description:
利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的
顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。输入一个包含上
述括号的表达式,检验括号是否配对。本题给出部分check()函数,要求将check()函数补充完整,并完成
整个程序。
算法:
代码:
1 void check() 2 { // 对于输入的任意一个字符串,检验括号是否配对 3 SqStack s; 4 SElemType ch[80],*p,e; 5 if(InitStack(s)) // 初始化栈成功 6 { 7 scanf("%s",ch); 8 p=ch; 9 while(*p) // 没到串尾 10 switch(*p) 11 { 12 case ‘(‘: 13 case ‘[‘:Push(s,*p); 14 p++; 15 break; // 左括号入栈,且p++,读下一个字符 16 case ‘)‘: 17 case ‘]‘:if(!StackEmpty(s)) // 栈不空,如果为空的话返回0;!0=1 18 { 19 Pop(s,e); // 弹出栈顶元素 20 if(*p==‘)‘&&e!=‘(‘||*p==‘]‘&&e!=‘[‘) 21 // 弹出的栈顶元素与*p不配对 22 { 23 printf("isn‘t matched pairs\n"); 24 exit(ERROR); 25 } 26 else 27 { 28 p++;//读取下一个字符 29 break; // 跳出switch语句 30 } 31 } 32 else // 栈空 33 { 34 printf("lack of left parenthesis\n"); 35 exit(ERROR); 36 } 37 default: p++; // 其它字符不处理,指针向后移 38 } 39 if(StackEmpty(s)) // 字符串结束时栈空 40 printf("matching\n"); 41 else 42 printf("lack of right parenthesis\n"); 43 } 44 }
时间: 2024-10-24 08:24:37