- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从中缀转换为后缀,然后评估后缀表达式以获得最终答案。不过,我遇到了一个严重的问题,因为出于某种原因,转换根本不起作用。例如,当我输入第一个中缀表达式:24 + 33 * ( 7 - 5 ) + 8/3 它输出 24 33 7 5 45404243 8 34743 这显然是非常错误的。我不太确定问题出在哪里。下面我已经包含了所有需要的代码。我还必须创建自己的堆栈类,因此如果有帮助,我也会将其包括在内。任何提示将不胜感激!
#include "stacks.h"
#include <iostream>
#include <string>
using namespace std;
bool IsOperand(char C)
{
if(C >= '0' && C <= '9') return true;
return false;
}
bool IsOperator(char C)
{
if(C == '+' || C == '-' || C == '*' || C == '/')
return true;
return false;
}
int GetOperatorWeight(char op)
{
int weight = -1;
switch(op)
{
case '+':
case '-':
weight = 1;
case '*':
case '/':
weight = 2;
}
return weight;
}
int HasHigherPrecedence(char op1, char op2)
{
int op1Weight = GetOperatorWeight(op1);
int op2Weight = GetOperatorWeight(op2);
return op1Weight > op2Weight ? true: false;
}
int PerformOperation(char operation, int operand1, int operand2)
{
if(operation == '+') return operand1 +operand2;
else if(operation == '-') return operand1 - operand2;
else if(operation == '*') return operand1 * operand2;
else if(operation == '/') return operand1 / operand2;
else cout<<"Unexpected Error \n";
return -1;
}
bool IsNumericDigit(char C)
{
if(C >= '0' && C <= '9') return true;
return false;
}
int evalPost(string item)
{
stacks S;
for(int i = 0;i< item.length();i++) {
if(item[i] == ' ' || item[i] == ',') continue;
else if(IsOperator(item[i])) {
int operand2 = stoi(S.stackTop()); S.pop();
int operand1 = stoi(S.stackTop()); S.pop();
int result = PerformOperation(item[i], operand1, operand2);
S.push(to_string(result));
}
else if(IsNumericDigit(item[i]))
{
int operand = 0;
while(i<item.length() && IsNumericDigit(item[i]))
{
operand = (operand*10) + (item[i] - '0');
i++;
}
i--;
S.push(to_string(operand));
}
}
return stoi(S.stackTop());
}
string infToPost(string item)
{
stacks S;
string postfix = "";
for(int i = 0;i< item.length();i++) {
cout<<postfix<<endl;
if(item[i] == ' ')
postfix +=item[i];
else if(IsOperator(item[i]))
{
while(!S.empty() && S.stackTop() != "(" && HasHigherPrecedence(*(S.stackTop().c_str()),item[i]))
{
postfix+= S.stackTop();
S.pop();
}
S.push(to_string(item[i]));
//S.pop();
}
else if(IsOperand(item[i]))
{
postfix +=item[i];
}
else if (item[i] == '(')
{
S.push(to_string(item[i]));
}
else if(item[i] == ')')
{
while(!S.empty() && S.stackTop() != "(") {
postfix += S.stackTop();
S.pop();
}
S.pop();
}
}
while(!S.empty()) {
postfix += S.stackTop();
S.pop();
}
return postfix;
}
int main()
{
string selection="";
string infix;
string postfix;
string eval;
cout<<"***********************************************************"<<endl;
cout<<"1. Read an expression in infix notation."<<endl;
cout<<"2. Convert infix to postfix."<<endl;
cout<<"3. Evaluate the expression using postfix notation."<<endl;
cout<<"4. Exit"<<endl;
cout<<"***********************************************************"<<endl;
cout<<"Select: ";
getline(cin, selection);
// cin>>selection;
// cin.ignore();
while (selection>"4" || selection<"1")
{
cout<< "Please enter a different choice (1-4): ";
getline(cin, selection);
}
while(selection!="4")
{
if (selection=="1")
{
cout<<"Enter an infix expression: ";
getline(cin,infix);
cout<<"\n";
}
if(selection=="2")
{
cout<<"Infix expression: "<<infix<<endl;
postfix = infToPost(infix);
cout<<"Postfix expression: "<<postfix<<endl;
cout<<"\n";
}
if(selection=="3")
{
cout<<"Infix expression: "<<infix<<endl;
eval = evalPost(postfix);
cout<<"Evaluation of this expression: "<<endl;
cout<<"\n";
}
selection = "";
cout<<"***********************************************************"<<endl;
cout<<"1. Read an expression in infix notation."<<endl;
cout<<"2. Convert infix to postfix."<<endl;
cout<<"3. Evaluate the expression using postfix notation."<<endl;
cout<<"4. Exit"<<endl;
cout<<"***********************************************************"<<endl;
cout<<"Select: ";
getline(cin,selection);
//cin.ignore();
while (selection>"4" || selection<"1")
{
cout<< "Please enter a different choice (1-4): ";
getline(cin, selection);
}
}
cout<<"Thank you for using my program."<<endl;
return 0;
}
堆栈类标题
#ifndef __Programming_Assingment_3__stacks__
#define __Programming_Assingment_3__stacks__
#include <string>
#include <vector>
using namespace std;
//define the stacks class
class stacks
{
public:
//constructor
stacks();
//push function
void push(string item);
//pop function
void pop();
//function to get top of stack
string stackTop();
//check if stack is empty
bool empty();
private:
//create vector and integer
int top;
vector<string> sstack;
};
#endif /* defined(__Programming_Assingment_3__stacks__) */
堆栈类 CPP 文件
#include "stacks.h"
#include <iostream>
#include <string>
using namespace std;
//Contstructor
stacks::stacks()
{
top = -1;
}
//push the item onto the stack
void stacks::push(string item)
{
sstack.push_back(item);
top++;
}
//check if the stack is empty
bool stacks::empty()
{
if (top==-1)
return true;
else
return false;
}
//delete the last item on the stack
void stacks::pop()
{
try{
if (sstack.size()==0) throw 0;
} catch(int err){
cout<<"stack is empty."<<endl;
cout<<"Cannot pop an item."<<endl;
return;
}
sstack.pop_back();
top--;
}
//get the top of the stack
string stacks::stackTop()
{
try{
if (sstack.size()==0) throw 0;
} catch (int err) {
cout<< "stack is empty."<<endl;
return 0;
}
return (sstack[top]);
}
最佳答案
当您使用此行将运算符压入堆栈时:
S.push(to_string(item[i]));
to_string
正在获取字符并将其视为整数。这会产生诸如“43”表示“+”和“45”表示“-”的字符串。
取而代之的是,您想要构造一个仅包含该字符的字符串。一种方法是使用带有计数和字符值的字符串构造函数。使用计数 1。
S.push(std::string(1, item[i]));
编辑:这里是 infoToPost
函数的变化。不要更改其他方法中的任何其他 to_string
调用,因为它们仍然是必需的(因为您要将整数值转换为字符串)。
string infToPost(string item)
{
stacks S;
string postfix = "";
for (int i = 0; i< item.length(); i++) {
cout << postfix << endl;
if (item[i] == ' ')
postfix += item[i];
else if (IsOperator(item[i]))
{
while (!S.empty() && S.stackTop() != "(" && HasHigherPrecedence(*(S.stackTop().c_str()), item[i]))
{
postfix += S.stackTop();
S.pop();
}
S.push(string(1, item[i]));
//S.pop();
}
else if (IsOperand(item[i]))
{
postfix += item[i];
}
else if (item[i] == '(')
{
S.push(string(1, item[i]));
}
else if (item[i] == ')')
{
while (!S.empty() && S.stackTop() != "(") {
postfix += S.stackTop();
S.pop();
}
S.pop();
}
}
while (!S.empty()) {
postfix += S.stackTop();
S.pop();
}
return postfix;
}
关于c++ - 中缀到后缀转换c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29596911/
这似乎是一个愚蠢的问题,但为什么在许多语言中存在 ++ 和 -- 运算符的前缀和后缀版本,但是没有类似 += 或 -= 等其他运算符的前缀/后缀版本?例如,如果我能写出这段代码: myArray[x+
我需要链接到第三方预建共享库。在 Windows 上,这意味着与 Third_party.lib 链接,在 Linux/Android 上,这意味着与 libThird_party.so 链接。所以为
我正在学习 C++ 中的运算符重载。原始后缀++ 的特性是它的优先级低于赋值运算符。例如,int i=0, j=0; i=j++; cout using namespace std; class V
如何在文本区域中添加每行前缀.. 示例: 这是文本区域的内容: hello124 我想为每一行添加一个 [b] 前缀和后缀,这样当我点击一个按钮时,结果将是: [b]hello[/b] [b]124[
背景:在传统的逆波兰表示法中,所有运算符都必须具有固定长度,这使得 RPN 可以很容易地被代码评估和操作,因为每个标记、表达式和子表达式都是“自包含”的,以至于人们可以盲目地替换 y在 x y *为
我有以下旨在修改日期格式的Javascript,但是我想添加原始日期或后缀,例如“st”,“nd”,“rd”,“th”到每个结束日期编号。例如,假设我们当前的日期设置为 4 月 28 日,但我想将日期
我想制定一个 header 检查规则来添加回复并将“发件人”更改为“不回复”。我将它用于某种扩散列表地址 我试过这个正则表达式代码,但它不起作用: if !/^From:(.+@myserver\.f
我想改变数据框的列内容,以便单元格内容以列名作为前缀: > x x VarX VarY 1 A C 2 B D 3 A C 4 B D > x$V
当我执行 ipconfig/all 时,我看到 DNS 后缀搜索列表。我需要从 java 中检索该值。有谁知道如何获得它或它从哪里来? 最佳答案 DNS 后缀列表读取自 HKLM\SYSTEM\Cur
当您编写一个包含大量类的应用程序时,您是否为类名使用了前缀/后缀?还是我应该只依赖我已经定义的 namespace ? 在我的例子中,我有这样的类: Blur Contrast Sharpen Inv
大多数浏览器会像这样显示有序列表: 1. foo 2. bar 3. baz 有没有办法更改编号以改为使用前缀: #1 foo #2 bar #3 baz 最佳答案 这是我能想到的最好的,你只在 Fi
我需要批量重命名多个图像,并希望使用父目录作为基本名称。为防止一个覆盖另一个,必须添加后缀。重命名过程的顺序必须遵循文件的时间戳。因为“第一个”文件是我正在使用它的网站的特色图片。 树: └── ma
我试图使用 sed 替换文件中的一些字符串,但遇到了一个问题。 我有以下字符串: TEMPLATE_MODULE TEMPLATE_SOME_ERR TEMPLATE_MORE_ERR 我想用一些字符
我对后缀/前缀运算符的优先级 和关联性 感到困惑。 一方面,当我阅读 K&R 书时,它指出: (*ip)++ The parentheses are necessary in this last ex
我有一个具有以下结构的图 V = {A1, A2, A3, A4, A5, .., An} E = {E1, E2, E3, E4, .., Ek} 现在我们定义A1的后缀: S(A1) = {All
这是解释性代码。语言是Java,代码使用Android。 fg.setTextSize(height*0.50f); //<-'f' is in the brackets 或 @Override pr
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我正在编写自己的数组类作为练习。因为,我读到非成员函数实际上在某些方面比成员函数更好。( Scott Meyers ) 我正在尝试编写尽可能多的运算符重载作为非成员函数。运算符重载 + , - 作为非
谁能解释一下关于 C 编程语言的中缀、后缀和前缀表示法是什么? 最佳答案 这是对 three terms, and how they apply 的一个很好的讨论. C 语言几乎到处都使用中缀表示法。
我有这种情况:我需要在输入文本字段 (html) 中添加引号而不更改输入的值。我正在使用 angular,所以我使用 ngModel,它看起来像这样 我希望输入字段显示“{{data}} 中的任何内
我是一名优秀的程序员,十分优秀!