基于wpf框架的简单四则生成混合运算(c#)

栈的合理使用时四则混合运算的关键。我这里也可以实现浮点数的加减,但是如果输入的字符串里面含有空格,我这里不能运行。还有我这里对于数据的分离是用空格字符隔开的,用来区分每个不同的数据。

栈的应用

直接上代码。
中缀表达式转后缀表达式


//进行中缀表达式转后缀表达式
//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

运行效果

界面代码我就不放了,上面的如果会了,基本上就没有什么问题了。

自己做的四则混合运算生成

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值