字符串表达式求值 C#实现

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ExpressionResult1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //建立一个数栈和一个操作符栈
        Stack<int> numberStack = new Stack<int>();
        Stack<char> operatorStack = new Stack<char>();

        private void button1_Click(object sender, EventArgs e)
        {
            //在表达式前后加开始和结束标识符
            string expressin = "#" + textBox1.Text + "#";
            bool label = false;//标识是否出现连续的数字字符
            foreach (char ch in expressin)
            {
                if (ch >= '0' && ch <= '9')//数字入栈
                {
                    if (label == true)
                    {
                        int temp = numberStack.Pop();
                        temp = temp * 10 + int.Parse(ch.ToString());
                        numberStack.Push(temp);
                    }
                    else
                    {
                        numberStack.Push(int.Parse(ch.ToString()));
                        label = true;
                    }
                }
                else
                {
                    if (operatorStack.Count == 0)//将开始标识符入栈
                    {
                        operatorStack.Push(ch);
                    }
                    else
                    {
                        label = false;
                        string priority = GetPriority(ch);
                        while(priority == "outOperator")//操作符出栈,并计算前后两个数
                        {
                            int num1 = numberStack.Pop();
                            int num2 = numberStack.Pop();
                            char oper = operatorStack.Pop();
                            int result = GetResult(num1 ,num2 ,oper);
                            numberStack.Push(result );

                            priority = GetPriority(ch);
                        }
                        if (priority == "inOperator")//操作符进栈
                        {
                            operatorStack.Push(ch);
                        }
                        else //操作符直接弹出
                        {
                            operatorStack.Pop();
                        }
                    }
                }
            }

            textBox2.Text = numberStack.Pop().ToString();

        }

        private string GetPriority(char outChar)//比较栈外和栈内两个操作符的优先级
        {
            char inChar = operatorStack.Peek();
            switch (outChar)
            {
                case '+':
                case '-':
                    switch (inChar)
                    {
                        case '+':
                        case '-':                          
                        case '*':
                        case '/':                    
                          return "outOperator";  
                        case '(':
                        case '#':
                          return "inOperator";
                    }
                    break;
                case '*':
                case '/':
                    switch (inChar)
                    {
                        case '+':
                        case '-':
                        case '(':
                        case '#':
                            return "inOperator";
                        case '*':
                        case '/':
                            return "outOperator";
                    }
                    break;
                case '(':
                    return "inOperator";
                case ')':
                    switch (inChar)
                    {
                        case '(':
                            return "abandonOperator";
                        default :
                            return "outOperator";
                    }                   
                case '#':
                    switch (inChar)
                    {
                        case '#':
                            return "abandonOperator";
                        default :
                            return "outOperator";
                    }
                default :
                    throw new Exception("包含非法字符!");
            }
            return "";
        }

        private int GetResult(int num1, int num2, char oper)//根据操作符计算两个数
        {
            int result = 0;
            switch (oper)
            {
                case '+':
                    result = num2 + num1;
                    break;
                case '-':
                    result = num2 - num1;
                    break;
                case '*':
                    result = num2 * num1;
                    break;
                case '/':
                    if (num1==0)
                    {
                        throw new Exception();
                    }
                    result = num2 / num1;
                    break;
                default :
                    result = 0;
                    break;
            }
            return result;

        }
    }
}

转载于:https://www.cnblogs.com/muscular_wolf/archive/2010/08/17/1801721.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界

全世界只有3.14 % 的人关注了爆炸吧知识众所周知&#xff0c;中国拥有约960万平方公里的陆地面积&#xff0c;我们生活在这片大地之上。但却鲜有人知道&#xff0c;中国的水下也有一座城。这是一座位于杭州千岛湖下的千年古城&#xff0c;历经61年&#xff0c;它们在水底&#…

php开启mysqlnd,如何启用mysqlnd的php?

我有PHP安装和运行(版本&#xff1a;5.3.17)&#xff0c;我想切换到mysqlnd(在phpinfo mysqlnd不存在)。我读了&#xff0c;为了设置它&#xff0c;你需要更新./configure命令&#xff1a;./configure --with-mysqlmysqlnd \--with-mysqlimysqlnd \--with-pdo-mysqlmysqlnd \当…

***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象...

http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希表 key 中的域 field 的值设为 value 。 如果 key 不存在&#xff0c;一个新的哈希表被创建并进行 HSET 操作。 如果域 field 已经存在于哈希表中&#xff…

lua loadstring传递参数_lua学习之函数篇

函数函数是对语句和表达式进行抽象的主要机制两种用法一是可以完成特定的任务&#xff0c;一句函数调用被视为一条语句二是以只用来计算并返回特定的结果&#xff0c;视为一句表达式print("Hello, World")a math.sin(3) math.cos(10)print(os.date())​无论哪种用法…

Redhat Linux编译安装LAMP环境

一&#xff1a;准备软件包存放/home/xiutuo/software/目录下。主要软件包&#xff1a;1. httpd-2.2.6.tar.gz 2. mysql-5.0.45-linux-i686-glibc23.tar.gz (这个版本是已编译好的压缩包&#xff0c;解压后稍做配置即可使用)3. php-5.2.5.tar.gz安装php所需的软件包&#xff08;…

EF Core 6 简化的数据库上下文注册

EF Core 6 简化的数据库上下文注册IntroEF Core 6 将简化现在的服务注册&#xff0c;DbContext 的服务注册将会更简单一些Sample直接来看示例代码吧&#xff1a;现在我们注册 EF Core 的 DbContext 通常是这样的&#xff1a;const string connectionString "DataSourcete…

Nginx指南

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。更多的请见官方wiki&#xff1a;http://wiki.nginx.org/Main 。 其优点…

快要“成精”的波士顿机械狗,开始卖了,价格不贵准备搞一只

全世界只有3.14 % 的人关注了爆炸吧知识重磅消息&#xff1a;这只全球著名的网红狗终于。。开&#xff01;售&#xff01;了&#xff01;哦&#xff0c;不对&#xff0c;放错图了&#xff01;应该是这只&#xff01;一起来看看视频介绍——6月17日&#xff0c;据科技时报&#…

php3.23,MySQL 3.23.40 又发布了-PHP教程,PHP基础

mysql 3.23.40 又发布了。修正了–low-priority-updates 和 insert 的问题。修正了从进程在一些特别的情况下超前主进程 22 字节的问题。为复制增加了 slave_wait_timeout修正了 update 和 bdb 表的问题。修正了bdb 表使用 key parts 的问题。修正了使用 grant file on databas…

用java写了一个汉诺塔

package com.brzhang;/*** 汉诺塔* 开始盘子全部都放在第一根柱子上* 目的&#xff1a;将第一根柱子上的盘子全部移动到第三根柱子上&#xff0c;规则是不能编号较大的盘子放在编号交小的盘子上面。**/ public class HanoTa {private long steps 1l;/**** param n 盘子个数* p…

python with循环_Python for循环、while循环

Python中有两种循环&#xff0c;分别为&#xff1a;for循环和while循环。for循环for循环可以用来遍历某一对象(遍历&#xff1a;通俗点说&#xff0c;就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结构如下&#xff1a;具体看这个案例&#xff1a;设…

BeetleX.WebFamily文件图片管理集成

BeetleX.WebFamily在2.4.8版本中集文件管理功能&#xff0c;通过这一功能可以不写任何代码的情况即可集成文件和图片的上传管理功能。接下来详细介绍下如何引入这一功能组件。文件管理功能是基于Vue和Element&#xff0c;所以只有在BeetleX.WebFamily中使用Vue和Element模板才能…

文字中间加横线效果

priceTV.setText("价格&#xff1a;2.00元"); priceTV.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);

解题报告 树形图计数

1. 题目 树形图计数 count.pas/c/cpp 【问题描述】 小k同学最近正在研究最小树形图问题。所谓树形图&#xff0c;是指有向图的一棵有根的生成树&#xff0c;其中树的每一条边的指向恰好都是从根指向叶结点的方向。现在小k在纸上画了一个图&#xff0c;他想让你帮忙数一下…

怎么部署_2020怎么部署新零售商城?

移动电子商务的发展壮大&#xff0c;5g网络技术的扶持&#xff0c;新零售概念时代推动店家完成零售转型&#xff0c;网上零售商城&#xff0c;再加上线下与推广线下的玩法&#xff0c;带来了效率和效益的提升。一&#xff0c;运用社交媒介&#xff0c;大力发展新零售概念下的销…

ARM立即数讲解--LDR和MOV的区别 .

Mov 是把立即数赋给一个寄存器&#xff0c;但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围&#xff0c;就没办法用一条MOV指令给寄存器赋值。LDR除了普通的读数之外&#xff0c;也有给寄存器赋立即数的功能。你只要写 LDR R…

python self 值自动改变,在python中对self的理解

在python中对self的理解 &#xff1a;一、self的位置是出现在哪里&#xff1f;首先&#xff0c;self是在类的方法中的&#xff0c;在调用此方法时&#xff0c;不用给self赋值&#xff0c;Python会自动给他赋值&#xff0c;而且这个值就是类的实例--对象本身。也可以将self换成别…

各种震撼的慢镜头,奇怪的知识又增加了!​

全世界只有3.14 % 的人关注了爆炸吧知识慢镜头&#xff08;高速摄影&#xff09;可能是现代最伟大的发明之一。从身边的日常到那些比较罕见的事物&#xff0c;慢镜头下看起来都比平时更酷&#xff01;喵星人接球这行云流水的动作&#xff0c;秒杀国足&#xff01;这是用多台风扇…

Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用

dpar在同一台电脑上不能run 相同appid&#xff0c;这个在上篇说过&#xff0c;所以就用外部负载均衡nginx来对应&#xff0c;那在不同的host中跑同一服务&#xff0c;看看dapr内部的负载均衡是怎么实现的。说说现有的服务&#xff0c;两个服务&#xff0c;订单服务&#xff0c;…

电脑编程教学_2020太原数控车床电脑编程一对一实操教学不限学时

2020太原数控车床电脑编程一对一实操教学不限学时石家庄工之艺数培训学校培训‘数控技术员’ 学生时&#xff0c;拿到图纸和毛坯,能够自己的在数控机床上做出成品。实行教学&#xff0c;“小班授课&#xff0c;一对一的教&#xff0c;理论实践相结合&#xff0c;随到随学&#…