反向抛光符号c# don'不能正确工作
本文关键字:不能 工作 抛光 符号 don | 更新日期: 2023-09-27 18:11:29
我写了一个rpn,带有一个罢工图。
最新问题:现在不能正常工作。
如果输入字符串为"5 + ((1 + 2)* 4)- 3"
我的输出是:5 1 2 + 4 * 3 - +
我必须得到这个结果:5 1 2 + 4 * + 3 -
编辑源代码
*这是最初的问题,但帮助了我,现在原来的错误被修复了:*,
在调试时循环或int i = 12, c值为0'0或其他值这个值被添加到输出(name: formula)字符串作为一个'('括号。我不知道为什么。和最后一个 '-' 运算符号,不要加到(或者不看)在的末尾输出字符串(公式)我怀疑这个问题是由(引起的。我尝试了其他字符串输入值的程序,但总是把一个'('到我的字符串,我不知道为什么…我看到它和括号的个数无关。总是只有一个'('添加到我的字符串…*)是的,在英语中LengyelFormula = rpn(它是匈牙利语)*
static void Main(string[] args)
{
String str = "5 + ( ( 1 + 2 ) * 4 ) −3";
String result=LengyelFormaKonvertalas(str);
Console.WriteLine(result.ToString());
Console.ReadLine();
}
static String LengyelFormaKonvertalas(String input) // this is the rpn method
{
Stack stack = new Stack();
String str = input.Replace(" ",string.Empty);
StringBuilder formula = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
char x=str[i];
if (x == '(')
stack.Push(x);
else if (IsOperandus(x)) // is it operand
{
formula.Append(x);
}
else if (IsOperator(x)) // is it operation
{
if (stack.Count>0 && (char)stack.Peek()!='(' && Prior(x)<=Prior((char)stack.Peek()) )
{
char y = (char)stack.Pop();
formula.Append(y);
}
if (stack.Count > 0 && (char)stack.Peek() != '(' && Prior(x) < Prior((char)stack.Peek()))
{
char y = (char)stack.Pop();
formula.Append(y);
}
stack.Push(x);
}
else
{
char y=(char)stack.Pop();
if (y!='(')
{
formula.Append(y);
}
}
}
while (stack.Count>0)
{
char c = (char)stack.Pop();
formula.Append(c);
}
return formula.ToString();
}
static bool IsOperator(char c)
{
return (c=='-'|| c=='+' || c=='*' || c=='/');
}
static bool IsOperandus(char c)
{
return (c>='0' && c<='9' || c=='.');
}
static int Prior(char c)
{
switch (c)
{
case '=':
return 1;
case '+':
return 2;
case '-':
return 2;
case '*':
return 3;
case '/':
return 3;
case '^':
return 4;
default:
throw new ArgumentException("Rossz paraméter");
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
class Sample {
static void Main(string[] args){
String str = "5 + ( ( 1 + 2 ) * 4 ) -3";
String result=LengyelFormaKonvertalas(str);
Console.WriteLine(result);
Console.ReadLine();
}
static String LengyelFormaKonvertalas(String input){
Stack<char> stack = new Stack<char>();
String str = input.Replace(" ", string.Empty);
StringBuilder formula = new StringBuilder();
for (int i = 0; i < str.Length; i++){
char x=str[i];
if (x == '(')
stack.Push(x);
else if (x == ')'){
while(stack.Count>0 && stack.Peek() != '(')
formula.Append(stack.Pop());
stack.Pop();
} else if (IsOperandus(x)){
formula.Append(x);
} else if (IsOperator(x)) {
while(stack.Count>0 && stack.Peek() != '(' && Prior(x)<=Prior(stack.Peek()) )
formula.Append(stack.Pop());
stack.Push(x);
}
else {
char y= stack.Pop();
if (y!='(')
formula.Append(y);
}
}
while (stack.Count>0) {
formula.Append(stack.Pop());
}
return formula.ToString();
}
static bool IsOperator(char c){
return (c=='-'|| c=='+' || c=='*' || c=='/');
}
static bool IsOperandus(char c){
return (c>='0' && c<='9' || c=='.');
}
static int Prior(char c){
switch (c){
case '=':
return 1;
case '+':
return 2;
case '-':
return 2;
case '*':
return 3;
case '/':
return 3;
case '^':
return 4;
default:
throw new ArgumentException("Rossz parameter");
}
}
}
在IsOperator中,检查c == '-'。
但是在字符串中,你写−3。
−与-
不相同我不知道波兰的东西,所以也许我错过了一些东西,但这就是为什么没有'-'操作符被打印出来,它没有通过IsOperator检查,进入else子句,这不会把它添加到公式中。
当你得到一个)
时,你应该弹出所有的运算符,并将它们添加到你的公式中,直到你得到一个(
,并弹出那个'('。
当你得到一个操作符时,只有当它的优先级大于或等于x
时,你才应该弹出堆栈并将这个操作符添加到公式中。你的第二张支票是多余的,因为它已经被第一张支票支付了。
作为一般规则:尝试您的程序与一些简单的输入,如1+2+3
, 1+2-3
, 1*2+3
和1+2*3
,看看你是否得到正确的结果。像这样系统地测试应该可以帮助您更快地发现错误。