文档库 最新最全的文档下载
当前位置:文档库 › 括号匹配(顺序表)

括号匹配(顺序表)


/*
Description

1、问题描述
一个算术表达式中包括圆括号、方括号和花括号三种形式的括号
编程实现判别表达式中括号是否正确匹配的算法

2、算法
顺序扫描算术表达式
若算术表达式扫描完成,此时如果栈空,则正确返回(0);如果栈未空,说明左括号多于右括号,返回(-3)
从算术表达式中取出一个字符,如果是左括号(‘(‘或‘[‘或 ‘{‘),则让该括号进栈(PUSH)
如果是右括号(‘)‘或‘]‘或 ‘}‘):
⑴、如果栈为空,则说明右括号多于左括号,返回(-2)
⑵、如果栈不为空,则从栈顶弹出(POP)一个括号: 若括号匹配,则转1继续进行判断;否则,说明左右括号配对次序不正确,返回(-1)

Input

第一行:样本个数,假设为n。
第二到n+1行,每一行是一个样本(算术表达式串),共n个测试样本。

Output

共有n行,每一行是一个测试结果,有四种结果:
0:左右括号匹配正确 {[(1+2)*3]-1}
-1:左右括号配对次序不正确 {[(1+2]*3)-1}
-2:右括号多于左括号 (1+2)*3)-1}
-3:左括号多于右括号 {[(1+2)*3-1]

Sample Input

4
{[(1+2)*3]-1}
{[(1+2]*3)-1}
(1+2)*3)-1}
{[(1+2)*3-1]
Sample Output

0
-1
-2
-3
*/









#include
#include
using namespace std;


int watch(char []);
void PUSH(char ch);
char POP();
int fun(char a,char b);


char s[200],lie[3]={'{','[','('},hang[3]={'}',']',')'};
int base=0,top=0;


int map[3][3]={1,0,0,
0,1,0,
0,0,1};

int main()
{

char str[200];
int n;

// freopen("cin.txt","r",stdin);
cin>>n;


while(n--)
{
cin>>str;
cout<base=0;
top=0;

}

return 0;
}


int watch(char ch[])
{
int i=0;

while(ch[i]!='\0')
{
if(ch[i]=='{'||ch[i]=='['||ch[i]=='(')
PUSH(ch[i]);

if(ch[i]=='}'||ch[i]==']'||ch[i]==')')
{
char getchar=POP();

if(getchar=='#')
return -2;

else if(fun(getchar,ch[i]))
return -1;
}
i++;
}

if(POP()=='#')return 0;

else return -3;


}

void PUSH(char ch)
{
s[top]=ch;
top++;
}

char POP()
{
if(base==top)return '#';

else
{
top--;
return s[top];
}
}

int fun(char a,char b)
{
int i,j;
for(i=0;i<3;i++)
if(lie[i]==a)
{
for(j=0;j<3;j++)
if(hang[j]==b)


if(i==j)return 0;
else return 1;
}
}

相关文档
相关文档 最新文档