括号匹配的有关问题。深夜发帖求解救啊
括号匹配的问题。。深夜发帖求解救啊!!!
写了一个括号匹配的程序,结果没问题,但是耗时太长!!请问下怎么改进啊~~
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n;
char data;
cin>>n;//n为要输入的括号的数量
while(n!=-1)//循环执行直到输入-1
{
if(n==0)//n=0也算匹配
{
cout<<"YES"<<endl;
}
else//具体算法,
{
stack<char> s;
for(int i=0;i<n;i++)
{
cin>>data;
if(s.empty()||data=='('||data=='['||data=='{')//栈空或输入左半括号则入栈
s.push(data);
else //说明新输入的是右括号
{ //判断新输入的与栈顶是否匹配
if(s.top()=='('&&data==')') //匹配则弹出栈顶元素
s.pop();
else if(s.top()=='['&&data==']')
s.pop();
else if(s.top()=='{'&&data=='}')
s.pop();
else //不匹配则说明压入了不符的右括号,直接跳出循环
break;
}
}
if(s.empty()) //栈为空,匹配
cout<<"YES"<<endl;
else
cout<<"NO"<<endl; //栈不为空,不匹配
}
cin>>n;
}
return 0;
}
------解决方案--------------------
不知道lz这样括号匹配可有什么实用价值。
想提高效率,可以去除奇数个“n为要输入的括号的数量”。奇数情况下,肯定是不匹配的。
同时,看你的算法,是第一个与当前输入的进行匹配。不如直接
char oldData,data;
cin >> oldData;
cin >> data;
bool isMatch;
switch(oldData)
{
case '(':
isMatch = (data == ')')?true:false;
break;
case '[':
isMatch = (data == ']')?true:false;
break;
...
default:
isMatch = false;
}
if(isMatch)
cout << "YES" << endl;
else
cout << "NO" <<endl;
------解决方案--------------------
写了一个括号匹配的程序,结果没问题,但是耗时太长!!请问下怎么改进啊~~
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n;
char data;
cin>>n;//n为要输入的括号的数量
while(n!=-1)//循环执行直到输入-1
{
if(n==0)//n=0也算匹配
{
cout<<"YES"<<endl;
}
else//具体算法,
{
stack<char> s;
for(int i=0;i<n;i++)
{
cin>>data;
if(s.empty()||data=='('||data=='['||data=='{')//栈空或输入左半括号则入栈
s.push(data);
else //说明新输入的是右括号
{ //判断新输入的与栈顶是否匹配
if(s.top()=='('&&data==')') //匹配则弹出栈顶元素
s.pop();
else if(s.top()=='['&&data==']')
s.pop();
else if(s.top()=='{'&&data=='}')
s.pop();
else //不匹配则说明压入了不符的右括号,直接跳出循环
break;
}
}
if(s.empty()) //栈为空,匹配
cout<<"YES"<<endl;
else
cout<<"NO"<<endl; //栈不为空,不匹配
}
cin>>n;
}
return 0;
}
------解决方案--------------------
不知道lz这样括号匹配可有什么实用价值。
想提高效率,可以去除奇数个“n为要输入的括号的数量”。奇数情况下,肯定是不匹配的。
同时,看你的算法,是第一个与当前输入的进行匹配。不如直接
char oldData,data;
cin >> oldData;
cin >> data;
bool isMatch;
switch(oldData)
{
case '(':
isMatch = (data == ')')?true:false;
break;
case '[':
isMatch = (data == ']')?true:false;
break;
...
default:
isMatch = false;
}
if(isMatch)
cout << "YES" << endl;
else
cout << "NO" <<endl;
------解决方案--------------------