• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)

开发技术 开发技术 3周前 (06-21) 21次浏览

1.介绍

后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后

2.举例说明

(3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 –

C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)

3.示例

输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果

思路分析:

从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;

重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果例如: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 – , 

针对后缀表达式求值步骤如下:

从左至右扫描,将3和4压入堆栈;
遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈;
将5入栈;
接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
将6入栈;
最后是-运算符,计算出35-6的值,即29,由此得出最终结果

代码实现:

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace DataStructure
{
    public class PolandNotation
    {
        public static void Test()
        {
            try
            {
                //定义逆波兰表达式
                string suffixExpression = "3 4 + 5 * 6 -";

                //将suffixExpression转换成链表的方式
                var list = GetListString(suffixExpression);

                //输出结果
                var result = Calculate(list);

                Console.WriteLine($"{suffixExpression}的结果是{result}");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
           
        }
        /// <summary>
        /// 获取集合
        /// </summary>
        /// <param name="suffixExpression"></param>
        /// <returns></returns>
        public static List<string> GetListString(string suffixExpression)
        {
            //首先实例化List
            List<string> list = new List<string>();

            //将字符串通过空格切换成数组
            string[] split=suffixExpression.Split(" ");

            //循环添加
            foreach (var item in split)
            {
                list.Add(item);
            }

            return list;
        }

        /// <summary>
        /// 计算
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public static int Calculate(List<string> list)
        {
            //创建栈
            Stack<string> stack = new Stack<string>();

            //循环遍历
            list.ForEach(item =>
            {
                //正则表达式判断是否是数字,匹配的是多位数
                if (Regex.IsMatch(item,"\d+"))
                {
                    //如果是数字直接入栈
                    stack.Push(item);
                }
                //如果是操作符
                else
                {
                    //出栈两个数字,并运算,再入栈
                    int num1 =int.Parse(stack.Pop());

                    int num2 = int.Parse(stack.Pop());

                    int result = 0;

                    if(item.Equals("+"))
                    {
                        result = num2 + num1;
                    }
                    else if(item.Equals("*"))
                    {
                        result = num2 * num1;
                    }
                    else if(item.Equals("/"))
                    {
                        result = num2 / num1;
                    }
                    else if (item.Equals("-"))
                    {
                        result = num2 - num1;
                    }
                    else
                    {
                        throw new Exception("无法识别符号");
                    }

                    stack.Push(""+result);
                }
            });

            //最后把stack中数据返回
            return int.Parse(stack.Pop());
        }
    }
}

结果图:

C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)

 


喜欢 (0)