today, 写中缀表达式转后缀表达式代码时遇到了一个问题: 用栈中函数top()时怎么也不输出.
错误代码:
#include <bits/stdc++.h>
using namespace std;
int l;
char suffix[10005];
string infix;
void inp()
{
cin>> infix;
}
void build_suffix()
{
stack <char> ops;
for(int i = 0; i < infix.size(); ++i)
{
char ch = infix[i];
if(isdigit(ch))
{
suffix[++l] = ch;
continue;
}
if(ch == '(')
{
ops.push(ch);
continue;
}
if(ch == ')')
{
while(ops.top() != '(')
{
suffix[++l] = ops.top();
ops.pop();
}
ops.pop();
continue;
}
while(ch == '&' && ops.top() == '&'&& !ops.empty())
{
suffix[++l] = ops.top();
ops.pop();
}
while(ch == '|' && (ops.top() == '&' || ops.top() == '|') && !ops.empty())
{
suffix[++l] = ops.top();
ops.pop();
}
ops.push(ch);
}
while(!ops.empty())
{
suffix[++l] = ops.top();
ops.pop();
}
}
void work()
{
build_suffix();
for(int i = 1; i <= l; ++i)
cout<< suffix[i] << ' ';
}
int main()
{
inp();
work();
return 0;
}
运行结果:
经过一番拼命调试, 最后终于发现错误所在.
正确代码:
#include <bits/stdc++.h>
using namespace std;
int l;
char suffix[10005];
string infix;
void inp()
{
cin>> infix;
}
void build_suffix()
{
stack <char> ops;
for(int i = 0; i < infix.size(); ++i)
{
char ch = infix[i];
if(isdigit(ch))
{
suffix[++l] = ch;
continue;
}
if(ch == '(')
{
ops.push(ch);
continue;
}
if(ch == ')')
{
while(ops.top() != '(')
{
suffix[++l] = ops.top();
ops.pop();
}
ops.pop();
continue;
}
while(ch == '&' && !ops.empty() && ops.top() == '&')
{
suffix[++l] = ops.top();
ops.pop();
}
while(ch == '|' && !ops.empty() && (ops.top() == '&' || ops.top() == '|'))
{
suffix[++l] = ops.top();
ops.pop();
}
ops.push(ch);
}
while(!ops.empty())
{
suffix[++l] = ops.top();
ops.pop();
}
}
void work()
{
build_suffix();
for(int i = 1; i <= l; ++i)
cout<< suffix[i] << ' ';
}
int main()
{
inp();
work();
return 0;
}
运行结果:
可以发现两者的不同, 前者后判断了栈是否为空
而后者先判断了栈是否为空
由此得知, 使用top()函数的前提: 栈不为空(一个微小的错误).