- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编写一个程序,使用链表堆栈将中缀表示法中的方程式转换为后缀表示法。程序的堆栈部分是它自己的类,在它自己的头文件中,并且正确实现(能够编译和运行我教授提供的测试主程序)。我目前正在研究将中缀字符串转换为继承类中的后缀字符串的实际函数。我有以下代码,自从我得到奇怪的输出后,我认为它在某处错误地完成了调车场算法。
template <class myType>
void infixToPostfix<myType>::convertToPostfix()
{
linkedStack<char> newS; //creating a new char stack
string output; //creating the postfix output string
for(int i = 0; i < infx.length(); i++) //cycle through the entire string
{
if (isgraph(infx[i])) //skip spaces
{
if (isalpha(infx[i])) //if the char is a letter (caps or uncaps)
{
output += infx[i]; //append it to output
}
else
{
if (newS.isEmptyStack()) newS.push(infx[i]);
else if (precedence(infx[i], newS.top()) //check if the current char has higher precedence than the top of the stack, or if the stack is empty
{
newS.push(infx[i]); //push the current char onto the stack
}
else if (infx[i] == ')') //check if the current char is a closing paren
{
for(;;)
{
if (newS.isEmptyStack()) break;
if (newS.top() != '(') //check if the top of the stack isn't an open paren
{
output += newS.top(); //append the top of the stack to the output
newS.pop(); //pop the top of the stack off
}
else //the top of the stack is a (
{
newS.pop(); //pop the ( off the stack
break; //break out of the for loop
}
}
}
else //the current char doesn't have higher precedence than the top of the stack
{
output += newS.top(); //append to the top of the stack to output
newS.pop(); //pop off the top of the stack
newS.push(infx[i]); //put the current char onto the top of the stack
}
}
}
}
while (!newS.isEmptyStack()) //not sure if this works, assuming we're at the end of the line at this point, and if there's anything on the stack we need to append it to the output
{
output += newS.top();
newS.pop();
}
pfx = output; //setting pfx to the output (pfx is the class variable for the postfix output)
}
我显示后缀字符串的函数如下
template <class myType>
void infixToPostfix<myType>::showPostfix()
{
cout << "Postfix Expression: " << pfx << endl;
}
运行程序时得到以下输出。
silverbox@silverbox-VirtualBox:~/Dropbox/CS202/ass13$ ./a.out testinput1.txt
Infix Expression: A + B - C
-ostfix Expression: AB+C
Infix Expression: A + B * C
*+stfix Expression: ABC
Infix Expression: A * B + C / D
/+stfix Expression: AB*CD
Infix Expression: (A + B) * C
*+(tfix Expression: AB)C
Infix Expression: A * (B + C) / D
/+(tfix Expression: A*BC)D
Infix Expression: (A + B) * (C - D)
-(+(fix Expression: AB)*CD)
Infix Expression: A * (B + C / D)
/+(tfix Expression: A*BCD)
Infix Expression: A + ((B + C) * (E - F) - G) / (H - I)
-(--(+( Expression: A+(BC)*EF)G)/HI)
silverbox@silverbox-VirtualBox:~/Dropbox/CS202/ass13$
老实说,我不明白为什么后缀表达式的奇数位会被推到我的 cout 中的字符串上。任何提示/帮助?
编辑:按照 ymett 的建议进行更改后,我的输出如下。我现在正试图找出我在尝试处理括号时出错的地方。
silverbox@silverbox-VirtualBox:~/Dropbox/CS202/ass13$ ./a.out testinput1.txt
Infix Expression: A + B - C
Postfix Expression: AB+C-
Infix Expression: A + B * C
Postfix Expression: ABC*+
Infix Expression: A * B + C / D
Postfix Expression: AB*CD/+
Infix Expression: (A + B) * C
Postfix Expression: AB)C*+(
Infix Expression: A * (B + C) / D
Postfix Expression: A*BC)D/+(
Infix Expression: (A + B) * (C - D)
Postfix Expression: AB)*CD)-(+(
Infix Expression: A * (B + C / D)
Postfix Expression: A*BCD)/+(
Infix Expression: A + ((B + C) * (E - F) - G) / (H - I)
Postfix Expression: A+(BC)*EF)G)/HI)-(--(+(
silverbox@silverbox-VirtualBox:~/Dropbox/CS202/ass13$
最佳答案
你还没有展示如何infx
已填充,但它似乎在末尾有一个回车符 (CR, '\r', 0x0d, 13)。
您的情况infx[i] != ' '
应替换为检查任何空白字符的条件,即 !isblank(infx[i])
.更好的是,不是检查您不需要的字符,而是检查您确实需要的字符;如果您没有列表,请使用 isgraph(infx[i])
(具有可见表示的任何字符,即不是控制字符或空格)。
条件infx[i] >= 65 && infx[i] <= 122
也不好首先你应该使用字 rune 字而不是数字,即infx[i] >= 'A' && infx[i] <= 'z'
.其次,您在 'Z'
之间包含了字符和 'a'
这不是字母,所以它应该是(infx[i] >= 'A' && infx[i] <= 'Z') || (infx[i] >= 'a' && infx[i] <= 'z')
.此外,您假设字母在字符集中是连续的,这对于 ASCII 是正确的,但对于所有字符集并非如此(尽管也许我们不必担心这一点)。更好地使用语言为您提供的工具,并编写 isalpha(infx[i])
.
关于c++ - 使用链表堆栈中缀到 Postfix 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13620901/
我在完成这个用于转换咖啡价格的 JavaScript 时遇到问题。我下载了一个调试器,它一直告诉我价格未定义,我不明白。这是脚本。 Coffee House
我有一个使用以下方法的 JSF 转换器: @Override public Object getAsObject(FacesContext context, UIComponent compo
我正在寻找类似paint.net 或Gimp 的东西,但对于音频文件,并在Windows 上运行。 最佳答案 Audacity太棒了 关于audio - 免费的声音编辑器/转换器?,我们在Stack
我目前正在使用以下代码来缩进 XML: transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputPr
我收到以下错误:Conversion Error setting value 'home' for 'null Converter'. Home是所显示内容的字符串表示形式。 对我来说,这没有意义。这
我的 UI 中有很多数字要处理。我希望它们中的一些没有小数位,一些是小数点后 2 位,而另一些是小数点后(3 位或 4 位小数)。 我有一个名为 DoubleToStringConverter 的转换
我正在制作一个货币转换器。转换器需要一个最小范围和最大范围,如果货币值高于或低于这些范围,转换器将要求您更改范围以能够转换货币。例如,如果用户将范围设置在 min-range 3 和 max-rang
我正在使用 Spring Shell 2 CLI,并尝试通过反射在运行时从定义的接口(interface)生成命令。 更新:接口(interface)的实现也是在运行时生成的。 我正在使用 Confi
我正在尝试编写一个通用的 Converter 以在我的代码中的多个类似情况下使用。我有一组子类,我只想使用一个 Converter 来处理,所以我想将一些东西(类类型/一些参数/等)传递给 Conve
我正在尝试读取一个在每个单元格中包含多个值的 csv 文件,并且我想将它们编码为单个 int 格式的字节以存储在 Pandas 单元格中,(例如 (1, 1) -> 771)。为此,我想使用 read
我正在 VC2013 中开发一个 c# Windows Phone 8.1 应用程序,并偶然发现了一个奇怪的问题。 为了使我的代码更“干净”,我决定将应用程序的不同部分放入不同的文件夹中。在 c# 代
是否有将 Puppet 脚本转换为 Chef 的转换器? 我找到了将 Chef 脚本转换为 Puppet 的 ruby 脚本 https://github.com/relistan/chef2pu
我已经开始寻找很好的解决方案,如何使用 Spring CassandraOperations 很好地持久化实体。问题开始是因为我的实体中的某些字段不受 cassandra 支持,例如乔达日期时间。 解
我知道如何实现单链表 monad 转换器,但无法运行其对应的数组。问题是存在分组效应,这使得转换器仅对可交换基 monad 有效。这是一个示例,为了简单起见,转换器和基础 monad 都是数组,并且没
当我尝试将值转换器从定义的枚举状态绑定(bind)到刷子时,我的 XAML 设计器中出现错误: 未找到“OKStatus”资源。 该应用程序在运行时运行良好,但我无法在设计器中看到我的 GUI。 我的
我需要使用列表单子(monad)变压器。我读到 ListT IO 存在潜在问题来自 Control.Monad.List , 自 IO不是可交换的,所以我在看 ListT done right .但我
不用多想,在我看来,一大组 Prolog 的功能可以实现为关系演算(a.k.a. SQL)。 有没有人听说过任何工具可以自动将 Prolog 转换为 SQL? 最佳答案 推荐: https://www
假设我在十六进制值(包括 alpha)中有这种颜色: x [1] "255 36 0" 但是,查看您请求的结果,您似乎在 x 中将 alpha 值作为第一个十六进制数。 - 所以你需要创建一个子字符
我正在寻找可用于跟踪程序进度的 monad 转换器。要解释如何使用它,请考虑以下代码: procedure :: ProgressT IO () procedure = task "Print som
我有一个非常基本的需求,即从数据库中获取一些数据并返回一个 DTO。我发现使用 nHibernate 连接多个表和“投影”可以说,到 DTO 是相当多的代码。在查看了几个示例后,大多数示例都不起作用,
我是一名优秀的程序员,十分优秀!