->概念
中缀表达式 9+(3-1)*3+10/2
转换步骤
9 +
9 + (
9 3 + ( -
9 3 1 + ( - )
9 3 1 - +
9 3 1 - + *
9 3 1 - 3 + * +
9 3 1 - 3 * + +
9 3 1 - 3 * + 10 +
9 3 1 - 3 * + 10 + /
9 3 1 - 3 * + 10 2 +/
9 3 1 - 3 * + 10 2 / +

后缀表达式 9 3 1 - 3 * + 10 2 / +
9 3 1 -
9 2 3
9 2 3 *
9 6 +
15 10 2 /
15 5 +
20

转换规则
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为
后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级别,是
右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并
输出,并将当前符号进栈,一直到最终输出后缀表达式为止

        /// <summary>
/// 定义级别
/// </summary>
static my[] mylist = {new my{i=,deouce=")"},
new my{i=,deouce="+"},
new my{i=,deouce="-"},
new my{i=,deouce="*"},
new my{i=,deouce="/"},
new my{i=,deouce="("}
};
static void Main(string[] args)
{
string s = "(1000*1000-10)+89*22";
List<string> ds = HouZui(getStr(ggg(s)));
Console.WriteLine(Reuslt(ds));
Console.Read();
}
/// <summary>
/// 计算结果的
/// </summary>
/// <param name="Tstr">后缀表达式</param>
/// <returns>结果</returns>
private static double Reuslt(List<string> Tstr)
{
Stack<double> stack = new Stack<double>();
foreach (var item in Tstr)
{
if (isNumber(item))
{
stack.Push(double.Parse(item));
}
else
{
double d1 = stack.Pop();
double d2 = stack.Pop();
stack.Push(GetResult(item, d2, d1));
}
}
return stack.Pop();
}
//根据中缀表达式转换成后缀表达式
private static List<string> HouZui(string[] ds)
{
List<string> Ts = new List<string>();
Stack<string> stack = new Stack<string>();
for (int i = ; i < ds.Length; i++)
{
string stemp = ds[i];
if (isNumber(stemp))//是数字就直接添加到字符串集合中
{
Ts.Add(stemp);
}
else//是符号就判断
{
string strtemp = " ";
try
{
strtemp = stack.Peek();
}
catch
{
stack.Push(stemp);
continue;
}
if (strtemp == " ")//表示第一次添加
{
stack.Push(stemp);
}
else//比较数据等级大小
{
if (getIntFromList(stemp) == )//判断当前符号是否为右边的括号
{
try
{
while ((strtemp = stack.Pop()) != "(")
{
Ts.Add(strtemp);
}
continue;
}
catch { continue; } }
//如果当前符号不是右边括号
//前面的是否大于当前的,
while (isLowser(strtemp, stemp) && strtemp != "(")
{
strtemp = stack.Pop();
Ts.Add(strtemp);
try
{
strtemp = stack.Peek();
}
catch
{
break;
} }
stack.Push(stemp);
} }
}
string ss = "dd";
try
{ while (ss != " ")
{
ss = stack.Pop();
Ts.Add(ss);
}
}
catch
{
ss = " ";
}
return Ts;
}
/// <summary>
/// 判断栈中的数据级别是否大于于将要加入栈中的符号
/// </summary>
/// <param name="Previous">前一个符号</param>
/// <param name="next">后一个符号</param>
/// <returns>大于为真,否则为假</returns>
private static bool isLowser(string Previous, string next)
{
if (getIntFromList(Previous) > getIntFromList(next))
{
return true;
}
return false;
}
//得到符号的等级
private static int getIntFromList(string s, int i = )
{ if (i == mylist.Length)
{
return ;
} my stmep = mylist[i];
if (stmep.deouce == s)
{
return stmep.i;
}
return getIntFromList(s, ++i);
}
//判断是否是数字
private static bool isNumber(string c)
{
Regex rg = new Regex("\\d");
return rg.IsMatch(c.ToString());
}
//分解字符串,得到符号和数字
private static string ggg(string s)
{
int i = ;
string temp = "";
string c1 = s[i].ToString();
if (s.Length == )
{
if (!isNumber(c1))
{
return " " + c1;
}
else
return c1.ToString();
}
else
{
if (!isNumber(c1))
{
c1 = " " + c1 + " ";
} }
//相等,就加入集合,并进行下一次查找
temp += c1;
return temp + ggg(s.Substring());
}
    //得到最终字符串
private static string[] getStr(string s)
{
List<string> Ts = new List<string>();
Ts.AddRange(s.Split(' '));
for (int i = Ts.Count - ; i > -; i--)
{
if (Ts[i] == "")
{
Ts.RemoveAt(i);
}
}
return Ts.ToArray();
}
private static double GetResult(string s, double d1, double d2)
{
Icc i = null;
switch (s)
{
case "+": i = new Add(); break;
case "-": i = new jian(); break;
case "*": i = new cheng(); break;
case "/": i = new Chu(); break;
}
return i.Count(d1, d2);
}
class my
{
public int i { get; set; }
public string deouce { get; set; }
}
}
interface Icc
{
double Count(double d1, double d2);
}
class Add : Icc
{
public double Count(double d1, double d2)
{
return d1 + d2;
}
}
class jian : Icc
{
public double Count(double d1, double d2)
{
return d1 - d2;
}
}
class cheng : Icc
{
public double Count(double d1, double d2)
{
return d1 * d2;
}
}
class Chu : Icc
{
public double Count(double d1, double d2)
{
return d1 / d2;
}
}

栈的应用-四则表达式(C#代码实现)的更多相关文章

  1. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  2. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  3. Lambda表达式常用代码示例

    Lambda表达式常用代码示例 2017-10-24 目录 1 Lambda表达式是什么2 Lambda表达式语法3 函数式接口是什么  3.1 常用函数式接口4 Lambdas和Streams结合使 ...

  4. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  5. python全栈开发-Day12 三元表达式、函数递归、匿名函数、内置函数

    一. 三元表达式 一 .三元表达式 仅应用于: 1.条件成立返回,一个值 2.条件不成立返回 ,一个值 def max2(x,y): #普通函数定义 if x > y: return x els ...

  6. Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算

    中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...

  7. 中缀表达式转后缀表达式(Java代码实现)

    后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 ...

  8. 数据结构--栈 codevs 1107 等价表达式

    codevs 1107 等价表达式 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Descripti ...

  9. 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

随机推荐

  1. 【UVa-679】小球下落——二叉树的编号

    在结点1处放一个小球,它会往下落.每个内结点上都会有一个开关,初始全部关闭,当每次有小球落到一个开关上时,状态都会改变.当小球到达一个结点是,如果结点上的开关关闭,则往左走,否则往右走,直到走到叶子的 ...

  2. Hadoop学习总结之五:Hadoop的运行痕迹

    Hadoop学习总结之五:Hadoop的运行痕迹   Hadoop 学习总结之一:HDFS简介 Hadoop学习总结之二:HDFS读写过程解析 Hadoop学习总结之三:Map-Reduce入门 Ha ...

  3. ios ViewController 页面跳转

    从一个Controller跳转到另一个Controller时,一般有以下2种: 1.利用UINavigationController,调用pushViewController,进行跳转:这种采用压栈和 ...

  4. jQuery和CSS 3定制HTML 5视频播放器

    目前,随着越来越多的浏览器开始支持更多的HTML5新特性,开发者也逐渐关注HTML5的开发.在众多HTML5的新特性中,视频方面的新特性是 很值得开发者和用户关注的.现在,只需要有支持HTML5的浏览 ...

  5. Google搜索的常用技巧

    个人搜索方案 1.选择合适的搜索词,一些行业术语或专家名字可以带来更加高质量的结果. 2.搜索词手动使用空格分隔,先进行第一次搜索,看搜索结果标题是否满足预期,如果不满足,采用更换关键词,添加关键词, ...

  6. 【LeetCode】9 & 234 & 206 - Palindrome Number & Palindrome Linked List & Reverse Linked List

    9 - Palindrome Number Determine whether an integer is a palindrome. Do this without extra space. Som ...

  7. SlidingPaneLayout的基本使用

      SlidingPaneLayout是V4包中新添加的组件,可以实现两列面板的切换.说先来看看API文档的说明: ? 1 SlidingPaneLayout provides a horizonta ...

  8. Winform後台如何動態修改App.config文件里的內容

    以下方法修改的,自己添加的app.config裡面不會顯示出修改的東西. 方法一:通過使用System.Xml.XmlDocument對象的方法進行bin\debug\~.vshost.exe.Con ...

  9. Mysql explain分析SQL语句之字段属性说明

    在 explain的帮助下,您就知道什么时候该给表添加索引,以使用索引来查找记录从而让select 运行更快.如果由于不恰当使用索引而引起一些问题的话,可以运行 analyze table来更新该表的 ...

  10. 20151007kaggle Titanic心得

    Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难.目前抽工作之余,断断续续弄了点,成绩为0.79426.在这个比赛过程中,接 ...