栈的合理使用时四则混合运算的关键。我这里也可以实现浮点数的加减,但是如果输入的字符串里面含有空格,我这里不能运行。还有我这里对于数据的分离是用空格字符隔开的,用来区分每个不同的数据。
栈的应用
直接上代码。
中缀表达式转后缀表达式
//进行中缀表达式转后缀表达式
//infix为中缀表达式,post是转化后的后缀表达式
public void toPostfixExpression(char[] infix, char[] post)
{
Stack<char> operation = new Stack<char>();//建立存储操作字符的栈
int j = 0;
int i = 0;
while (true)
{
//当i循环到infix.Length时,跳出循环
if (i >= infix.Length)
{
break;
}
if (isNumber(infix[i]) || infix[i] == '.')
{
//Console.WriteLine(infix[i]);
// Console.WriteLine(infix.Length);
//数字字符直接输出到后缀表达式,直到下一位不是数字字符输出空格后到后缀表达式并跳转
while (isNumber(infix[i]) || infix[i] == '.')
{
// Console.Write(infix[i]);
post[j++] = infix[i++];
if (i >= infix.Length)
{
break;
}
}
post[j++] = ' ';
i--;
}
else if (isOperation(infix[i]))
{
while (true)
{
// Console.Write(infix[i]);
if (operation.Count == 0 || operation.Peek() == '(')//遇到左括号直接入栈
{
operation.Push(infix[i]);
break;
}
else if (priority(infix[i]) > priority(operation.Peek()))//对操作符进行优先级判断
{
operation.Push(infix[i]);
break;
}
else
{
post[j++] = operation.Peek();
post[j++] = ' ';
operation.Pop();
}
}
}
else if (infix[i] == ')')
{
//遇到右括号时,一直出栈,直到匹配到第一个左括号
while (operation.Peek() != '(')
{
post[j++] = operation.Peek();
post[j++] = ' ';
operation.Pop();
}
operation.Pop();
}
else if (infix[i] == '(')
{
operation.Push(infix[i]);
}
else if (infix[i] == '\0')
{
break;
}
else
{
return;
}
i++;
}
//将栈中剩余的数据全部出栈
while (operation.Count != 0)
{
post[j++] = operation.Peek();
post[j++] = ' ';
operation.Pop();
}
post[j++] = '\0';
//Console.WriteLine(post);
}
后缀表达式计算:
//对于后缀表达式的计算
public double CalPostfixExpression(char[] ch)
{
Stack<double> num = new Stack<double>();//生成栈,用来存储操作数
int i = 0;
while (true)
{
if (isNumber(ch[i]) || ch[i] == '.')//对数和小数点进行判断
{
//将字符串转化成浮点数
double temp = 0;
bool is_int = true;//整数
while (isNumber(ch[i]) || ch[i] == '.')
{
if (ch[i] == '.')
{
is_int = false;
}
else
{
if (is_int)
{
temp = (ch[i] - '0') + temp * 10;
}
else
{
temp = (ch[i] - '0') * 0.1 + temp;
}
}
i++;
}
i--;
num.Push(temp);
}
else if (ch[i] == ' ')
{
i++;
continue;
}
else if (ch[i] == '*')
{
double a = num.Pop();
double b = num.Pop();
num.Push(a * b);
}
else if (ch[i] == '/')
{
double a = num.Pop();
double b = num.Pop();
num.Push(b / a);
}
else if (ch[i] == '+')
{
double a = num.Pop();
double b = num.Pop();
num.Push(a + b);
}
else if (ch[i] == '-')
{
double a = num.Pop();
double b = num.Pop();
num.Push(b - a);
}
else if (ch[i] == '\0')
{
return num.Peek();
}
else
{
return 0;
}
i++;
}
}
//判断整数
private bool isNumber(char c)
{
if (c>= '0' && c <= '9')
{
return true;
}
else
{
return false;
}
}
//判断操作符
private bool isOperation(char c)
{
switch (c)
{
case '*':
case '/':
case '+':
case '-':
return true;
default:
return false;
}
}
//返回优先级
private int priority(char c)
{
switch (c)
{
case '*': return 5;
case '/': return 5;
case '+': return 4;
case '-': return 4;
default: return 0;
}
}
** 当简单生成随机数时,需使用同一Random()对象**
//这样产生的两个随机数才不会相同
Random random_op = new Random();
int op_easy_1 = random_op.Next(1, 100);//产生1~99的随机整数 --77
int op_easy_2 = random_op.Next(1, 100);//产生1~99的随机整数 --23
//这样产生的随机数是一样的
Random random_op1 = new Random();
Random random_op2 = new Random();
int op_easy_1 = random_op1.Next(1, 100);//产生1~99的随机整数 --77
int op_easy_2 = random_op2.Next(1, 100);//产生1~99的随机整数 --77
运行效果
界面代码我就不放了,上面的如果会了,基本上就没有什么问题了。
自己做的四则混合运算生成