题目
判断表达式的括号是否匹配
思路
对表达式进行遍历,遇到左括号直接入栈,遇到右括号时与栈顶元素对比,如果是对应的右括号,则将左括号出栈,如果不是或栈为空,则不匹配,当最后匹配完时,若栈不为空也,则也不匹配
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 1000
typedef struct stack{
char a[MAXSIZE];
int top;
int maxSize;
}Stack;
void Init(Stack*p);
void stackIn(Stack*p,char a);
void stackOut(Stack*p);
int main()
{
Stack stack;
Init(&stack);
char s[MAXSIZE];
scanf("%s",s);
int len=strlen(s);
int flag=1; //用flag表示是否匹配
for(int i=0;i<len;i++){
if(s[i]=='['||s[i]=='('||s[i]=='{'){ //左括号入栈
stackIn(&stack,s[i]);
}else if(s[i]==']'||s[i]==')'||s[i]=='}'){ //右括号判断
if(stack.top<0){ //判断是否为空栈
flag=0;
}else{
switch(s[i]){ //判断是否匹配
case ']':{
if(stack.a[stack.top]!='['){
flag=0;
}
break;
}
case '}':{
if(stack.a[stack.top]!='{'){
flag=0;
}
break;
}
case ')':{
if(stack.a[stack.top]!='('){
flag=0;
}
break;
}
}
if(flag) stackOut(&stack);
}
}
if(flag==0){
break;
}
}
if(stack.top>=0){ //判断左括号是否匹配完
flag=0;
}
if(flag){
printf("各种括弧匹配");
}else{
printf("各种括弧不匹配");
}
}
void Init(Stack*p) //初始化栈
{
p->top=-1;
p->maxSize=MAXSIZE;
}
void stackIn(Stack*p,char a) //入栈
{
if(p->top>=MAXSIZE){
return;
}
p->a[++p->top]=a;
}
void stackOut(Stack*p) //出栈
{
if(p->top<0){
return;
}
p->top--;
}