设计一个算法判别一个算术表达式的圆括号是否正确配对。
样例输入:
(7+8)*10+(
样例输出:
0 \\不匹配
输入:
(7+8)*10
输出:
1 \\匹配
输入输出样例:1组
#1
- 样例输入:
(7+8)*10+(
- 样例输出:
0
#include <stdio.h>
#include <stdlib.h>
#define max 100
typedef struct sta
{
char data[max];
int top;
} stack;
stack* init()//栈初始化
{
stack *s=(stack*)malloc(sizeof(stack));
s->top=-1;
return s;
}
int empty(stack *s)//判断是否空栈
{
if(s->top==-1)
return 1;
else return 0;
}
int push(stack* s,char x)//压栈
{
if(s->top==max-1) return -1;//若栈已满,则返回
else
{
s->top++;
s->data[s->top]=x;
return 1;
}
}
int pop(stack* s,char *x)//出栈
{
if(empty(s)) return 0;
else
{
*x=s->data[s->top];
s->top--;
return 1;
}
}
int result()
{
char x;int flag=1,flag1=1;//看是否能合适的入栈和出栈
stack *s=init();
//scanf("%c",&x);
//getchar();//消除输入一个换行字符的影响,
//while((x!='\n')zhe
//这里会导致超时,x!='\n'这个条件一直都满足,跳不出循环,因为输入文件末尾根本就没有回车符,而在codeblock中输入完数据后会手动敲一个回车符,一个陷入死循环一个能正常结束,EOF是文件结束标志
while((x=getchar())!=EOF)//如果是'('则压栈,')'则出栈
{
if(x=='(')
flag=push(s,x);
if(x==')')
flag1=pop(s,&x);
}
if(empty(s)&&flag==1&&flag1==1) return 1;//遍历完后栈中无括号则匹配正确
else return -1;
}
int main()
{
int flag;
flag=result();
if(flag==1)
printf("1");
else printf("0");
return 0;
}