->概念
中缀表达式 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. ssh-keygen的用法

    一.概述 1.就是为了让两个linux机器之间使用ssh不需要用户名和密码.采用了数字签名RSA或者DSA来完成这个操作 2.模型分析 假设 A (192.168.20.59)为客户机器,B(192. ...

  2. 关于Servlet的PrintWriter 中文乱码问题

    ps:servlet的PrintWriter和ServletOutputStream是不能同时使用的,同时使用会抛异常; PrintWriter是字符流.ServletOutputStream是字节流 ...

  3. 可以用google了

    半年都上不了google,现在可以了, 哈哈,支持自动更新, 有时候用google还是很不错的,尤其是英文搜索.

  4. C# 阳历转农历

    你妹的sb 原文 C#(ASP.NET)公历转农历的简单方法 Dot Net 平台,对全球化的支持做的非常好,不得不称赞一个 通常,将公历转为农历,是个非常烦的事情,需要整理闰年.闰月等的对照表. 在 ...

  5. (C#)RichTextBox控件

    RichTextBox(有格式文本)控件可实现TextBox控件的所有功能. ❶在RichTextBox控件中显示滚动条 RichTextBox可设置Multiline属性来控制是否显示滚动套,tru ...

  6. XSS 前端防火墙(3):无懈可击的钩子

    昨天尝试了一系列的可疑模块拦截试验,尽管最终的方案还存在着一些兼容性问题,但大体思路已经明确了: 静态模块:使用 MutationObserver 扫描. 动态模块:通过 API 钩子来拦截路径属性. ...

  7. Java 8开发的4大顶级技巧

    我使用Java 8编码已经有些年头,既用于新的应用程序,也用来迁移现有的应用,感觉是时候写一些我发现的非常有用的“最佳实践”.我个人并不喜欢“最佳实践”这个说法,因为它意味着“一刀切”的解决方案,而编 ...

  8. jquery功能实现总结

    最近一直在做.net这方面的,也学习了jquery一些东西,其中实现了自动关闭页面,json解析字符串,拼接字符串,for循环,函数调用,等一些功能,自己也学习了,也希望可以帮助大家,大家看后给提提意 ...

  9. LR回放测试脚本

    1.设置run time setting Pacing:设置什么时候进行迭代 2.实时观察回放录像 3.回放脚本 4.查看结果

  10. html --- ajax --- javascript --- 简单的封装

    Ajax的简单封装 Ajax的全称是AsynchronousJavaScriptAndXML 如有疑问请参考:http://zh.wikipedia.org/zh-cn/AJAX 以及传智播客的视频教 ...