你好,Stack,我现在正想写一个RPN转换器,我是C新手。但是我遇到了问题。希望我能详细解释这些问题。我使用数组来堆叠运算符。当我开始讨论以下问题时,让我们使用示例“5 8”:
else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){
while(isp(stack1.top()) >= icp(infix[i])){
postfix += stack1.pop();
}
if(isp(stack1.top()) < icp(infix[i])){
stack1.push(infix[i]);
}
出于某种原因,它会将运算符推到堆栈上,但不会将运算符添加到后缀字符串变量中,因为我也在添加我的元素。我看了一下我的pop函数,这似乎是正确的,但我很困惑。如果你能把我引向正确的方向那就太好了。
这是我的完整代码:
#include <iostream>
#include <string>
#define DEFAULT_SIZE 100
using namespace std;
class Stack{
private:
char *array;
int tos, capacity;
public:
//constructors
Stack();
//Destructor
~Stack();
//Methods
void push(char a);
char pop();
char top();
int get_size();
bool is_empty();
bool is_full();
void display();
};
Stack::Stack(){
array = new char[DEFAULT_SIZE];
tos = 0;
capacity = DEFAULT_SIZE;
}
Stack::~Stack(){
delete[] array;
}
void Stack::push(char a){
if(!is_full())
array[tos++] = a;
}
char Stack::pop(){
return array[--tos];
}
char Stack::top(){
return array[tos];
}
int Stack::get_size(){
return tos;
}
bool Stack::is_empty(){
if(tos == 0)
return true;
else
return false;
}
bool Stack::is_full(){
if(tos == capacity)
return true;
else
return false;
}
void Stack::display(){
if (tos == 0)
cout<<"The stack is empty"<<endl;
else{
for (int i=0; i<tos;i++)
cout<<array[i]<<" ";
cout<<endl;
}
}
int isp(char a){
if(a == '^'){
return 3;
}
else if (a == '*' or a == '/'){
return 2;
}
else if(a == '+' or a == '-'){
return 1;
}
else if(a == '('){
return 0;
}
else
return -1;
}
int icp(char a){
if(a == '^'){
return 4;
}
else if (a == '*' or a == '/'){
return 2;
}
else if(a == '+' or a == '-'){
return 1;
}
else if(a == '('){
return 4;
}
}
int main(){
string infix, postfix;
Stack stack1;
cout << "This is a Infix to Postfix Expression converter." << endl;
cout << "Enter your Infix Expression: ";
cin >> infix;
stack1.push('#');
for(int i=0;i<infix.length();i++){
if(isdigit(infix[i]) or isalpha(infix[i])){
postfix += infix[i];
}
else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){
while(isp(stack1.top()) >= icp(infix[i])){
postfix += stack1.pop();
}
if(isp(stack1.top()) < icp(infix[i])){
stack1.push(infix[i]);
}
}
}
cout << postfix;
return 0;
}
另外,如果你知道C RPN转换器上的任何好的资源网站,请随时分享,因为这将是一个非常大的帮助!我在谷歌上找到了一个随机的算法。
在您的示例中,您只是在堆栈上按下“”符号,但您从未弹出它,因为在处理符号“8”后,您将留给了
循环。我认为您需要另一个while循环来清空最后的堆栈。
for(int i=0;i<infix.length();i++){
if(isdigit(infix[i]) or isalpha(infix[i])){
postfix += infix[i];
}
else if(infix[i] == '+' or infix[i] == '-' or infix[i] == '*' or infix[i] == '/' or infix[i] == '^'){
while(isp(stack1.top()) >= icp(infix[i])){
postfix += stack1.pop();
}
if(isp(stack1.top()) < icp(infix[i])){
stack1.push(infix[i]);
}
}
}
// Fetch the remaining operators from the stack
while(!stack1.is_empty()){
postfix += stack1.pop();
}
cout << postfix;
当心bug,因为我自己无法测试这段代码。
问题内容: 我正在寻找后缀符号表示法的算法,该算法将产生最小数量的括号。 我发现它会产生很多括号:http : //tajendrasengar.blogspot.com/2011/09/postfix-to- infix-algorithm.html 例如 输入: 结果: 问题答案: 如果您确实希望尽可能地减少括号,则需要执行的操作与链接的算法类似。然而… 您应该为中的每个 复合 操作数存储一个
我应该将以下内容转换为后缀形式: 我得到了这个答案: 这是正确的吗?如果我使用了错误的后缀形式,那么之后还有很多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。
如何正确地为任何类型生成前缀和后缀运算符? 例如,我有一个枚举类: 我尝试创建操作符重载,如: 但这不起作用。 错误:“operator”不匹配 一般来说,如何重载运算符? 我想看看任何类型的通用指南。
问题内容: 我的朋友给我开了个玩笑: 问:C和C ++有什么区别? A.没什么,因为:(C-C ++ == 0) 我试图更改订单并被卡住。 看下面的代码: 为什么返回: 我了解后缀和前缀增量。为什么这不是结果? 问题答案: 因为在第一个示例中,从10开始 递增,然后返回10,所以第二个示例由于已递增而现在求值为11。因此,求出的最终表达式为,等于-1。 在第二个示例中,再次增加,但返回12,因为它
为数字添加序号后缀。 使用模运算符(%)来查找各位和十位的值。查找哪些序号模式数字匹配。如果数字在十位模式中找到,请使用十位的序数。 const toOrdinalSuffix = num => { const int = parseInt(num), digits = [int % 10, int % 100], ordinals = ['st', 'nd', 'rd', '
问题内容: 从下面或此处的程序中,为什么最后一次调用要打印该值7? 问题答案: 这将打印出“ 6”,因为它将i加1并返回值。5 + 1 = 6;这是前缀,在操作中使用该编号之前会添加该编号。 这将打印出“ 6”,因为它需要i,存储副本,加1并返回副本。因此,你获得了我当时的价值,但同时又增加了它。因此,你可以打印出旧值,但是它会增加。后缀增量的好处。 然后,当你打印出i时,它会显示i的实际值,因为