我有一个简单的程序,按优先顺序列出输入,仅检查运算符并按如此排名,“* / + - ”:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int prec(char op)
{
if (op == '*' || op == '/') return 0;
return 1;
}
bool compareprec(char a, char b)
{
return prec(a) < prec(b);
}
int main()
{
char input[] = "+-/*";
cin >> input;
sort(input, input + 4, &compareprec);
cout << input;
}
我正在尝试在一个更复杂的程序中实现它,该程序使用堆栈来检查字母数字输入并执行中缀到后缀转换,排名看起来像这样:“9 * 9 + 9”到“9 9 9 * +“。更复杂的计划如下:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int prec(char op)
{
if (op == '*' || op == '/' || op == '+' || op == '-') return 0;
return 1;
}
bool compareprec(char a, char b)
{
return prec(a) < prec(b);
}
int main()
{
stack<char> s;
char input;
while (cin.get(input) && input != '\n')
{
if (isalnum(input))
cout << input << " ";
else if (input == '(')
s.push(input);
else if (input == ')')
{
while (!s.empty() && s.top() != '(')
{
cout << s.top() << " ";
s.pop();
}
if(!s.empty())
s.pop();
else
cout << "ERROR: No Matching ( \n";
}
else if (s.empty() && input == '*'|| input == '/'|| input == '+'|| input == '-')
{
sort(input, input + 4, &compareprec); // Error Begins Here?
s.push(input);
}
else if (input == '*'||input == '/'||input == '+'|| input =='-')
while (!s.empty())
{
sort(input, input + 4, &compareprec); // More Errors Here?
cout << s.top() << "\n ";
s.pop();
s.push(input);
}
}
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
}
但我一直收到错误消息:
error: no matching function for call to 'sort(char&, int, bool (*)(char, char))'
error: no matching function for call to 'sort(char&, int, bool (*)(char, char))'
我不确定为什么。我知道这可能是一些非常明显/愚蠢的事情,但我无法弄明白。任何帮助,将不胜感激。提前谢谢!
答案 0 :(得分:3)
sort期望可以迭代的东西。
您的工作示例
char input[]
(char数组)
您的非工作示例删除了数组语法并使其成为纯字符
char input
当您尝试执行此操作时:
sort(input, input + 4, &compareprec)
在工作的情况下,因为你提供了一个数组,所以你要告诉它从输入的开头迭代到该位置之后的4。在非工作的情况下,你告诉它从说'a'到'd'(这是'a'+ 4)。
答案 1 :(得分:1)
为什么你要在第二个例子中对任何东西进行排序?您最多需要比较两个运算符,一个位于堆栈顶部,另一个位于输入中。只需使用您的compareprec
- 函数,并根据结果采取相应措施。
顺便说一句,为了使你的代码更漂亮,创建一个函数:
bool is_operator(char s);
几乎忘了告诉你,第二个例子中int prec(char a)
的版本是错误的,使用第一个版本。