括号匹配问题
- //栈在括号匹配问题中的应用,假设表达式中允许存在三种括号:方括号和圆括号和花括号,其嵌套顺序任意,即 ({}) 或 [{([][])}] 等均为正确格式,[(]) 或 ([)) 或 (()] 均为不正确格式
- 算法思路:以 ({}) 为例,如果是左括号则入栈,第一个字符 ’ ( '入栈,然后第二个 ’ [ ’ 也入栈 。接下来的第三个字符 ’ ] ’ 就不入栈,直接和栈中的 第二个 a[top] ’ [ ’ 比较,如果匹配 则栈中 a[top] 出栈 ,即top-1; 继续比较下一个字符,循环循环循环。如果一旦遇到右括号,但是 现在的a[top] 和右括号不一样,则匹配失败
- 算法实现
- 栈的基本操作 基操
#include <stdio.h>
#include <string.h>
typedef struct node{
int top;
char a[100];
}S;
void InitStack(S *s){
s->top=0;
}
int Push(S *s,char m){
if(s->top == 19)
return -1;
s->top++;
s->a[s->top] = m;
return true;
}
int Pop(S *s){
if(s->top==0)
return false;
else{
s->top--;
return true;
}
}
char GetTop(S *s){
if(s->top==0)
return 0;
else{
return s->a[s->top];
}
}
int panduan(char pd){
if(pd == '(' || pd == ')' || pd == '[' || pd
== ']' || pd == '{' ||pd == '}')
return true;
else
return false;
}
int text(char *str,S *s){
int i =0;
int size = strlen(str);
for(;i<size;i++){
if(panduan(str[i])){
if(str[i] == '(' || str[i] == '[' || str[i] == '{')
Push(s,str[i]);
else{
char ch = GetTop(s);
if( ch == '(' && str[i] == ')' ||
ch == '[' && str[i] == ']' ||
ch == '{' && str[i] == '}')
Pop(s);
else{
printf("括号次序不匹配!\n");
return false;
}
}
}
}
if(s->top != 0){
printf("左边括号比右边多!\n");
return false;
}
return true;
}
int main(){
S *s;
char str[20];
printf("请输入:");
gets(str);
if(str[0] == ']' || str[0] == '}' || str[0] == ')'){
printf("输入错误!");
return 0;
}
InitStack(s);
if(text(str,s))
printf("匹配成功!");
else
printf("匹配失败!");
return 0;
}
2020/3/29/18/03