中缀表达式到后缀表达式的转换要把表达式从中缀表达式的形式转换成用后缀表示法
表示的等价表达式
C# Code:
//using System;
class Class1
{
public static void Main()
{
System.Console.WriteLine("Hello World!");
//中缀 => 后缀表达式
string s = "( 1.9 + (20 + 41) / (25 * 11) - 3 ) * 2"; //中缀; //中缀
string S = ""; //后缀
char[] Operators = new char[s.Length];
int Top = -1;
for (int i = 0; i < s.Length; i++)
{
char C = s[i];
switch (C)
{
case ' ' : //忽略空格
break;
case '+' : //操作符
case '-' :
while (Top >= 0) //栈不为空时
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
S = S + c;
}
}
Operators[++Top] = C; //push Operator
S += " ";
break;
case '*' : //忽略空格
case '/' :
while (Top >= 0) //栈不为空时
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
if (c == '+' || c == '-')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
S = S + c;
}
}
}
Operators[++Top] = C; //push Operator
S += " ";
break;
case '(' :
Operators[++Top] = C;
S += " ";
break;
case ')' :
while (Top >= 0) //栈不为空时
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
break;
}
else
{
S = S + c;
}
}
S += " ";
break;
default :
S = S + C;
break;
}
}
while (Top >= 0)
{
S = S + Operators[Top--]; //pop Operator
}
System.Console.WriteLine(S); //后缀
//后缀表达式计算
double[] Operands = new double[S.Length];
double x, y, v;
Top = - 1;
string Operand = "";
for (int i = 0; i < S.Length; i++)
{
char c = S[i];
if ((c >= '0' && c <= '9') || c == '.')
{
Operand += c;
}
if ((c == ' ' && Operand != "") || i == S.Length - 1)
{
Operands[++Top] = System.Convert.ToDouble(Operand) ; //push Operands
Operand = "";
}
if (c == '+' || c == '-' || c == '*' || c == '/')
{
if ((Operand != ""))
{
Operands[++Top] = System.Convert.ToDouble(Operand) ; //push Operands
Operand = "";
}
y = Operands[Top--]; //pop 双目运算符的第二操作数 (后进先出)注意操作数顺序对除法的影响
x = Operands[Top--]; //pop 双目运算符的第一操作数
switch (c)
{
case '+' :
v = x + y;
break;
case '-' :
v = x - y;
break;
case '*' :
v = x * y;
break;
case '/' :
v = x / y; // 第一操作数 / 第二操作数 注意操作数顺序对除法的影响
break;
default :
v = 0;
break;
}
Operands[++Top] = v; //push 中间结果再次入栈
}
}
v = Operands[Top--]; //pop 最终结果
System.Console.WriteLine(v);
System.Console.ReadLine();
}
}
Java Code:
class Class1
{
public static void main(String[] args)
{
System.out.println("Hello World!");
//中缀 => 后缀表达式
String s = "( 1.9 + (20 + 41) / (25 * 11) - 3 ) * 2"; //中缀
String S = ""; //后缀
char[] Operators = new char[s.length()];
int Top = -1;
for (int i = 0; i < s.length(); i++)
{
char C = s.charAt(i);
switch(C)
{
case ' ' :
break;
case '+' : //操作符
case '-' :
while (Top >= 0) //栈不为空时
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
S = S + c;
}
}
Operators[++Top] = C; //push Operator
S += " ";
break;
case '*' : //操作符
case '/' :
while (Top >= 0) //栈不为空时
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
if (c == '+' || c == '-')
{
Operators[++Top] = c; //push Operator
break;
}
else
{
S = S + c;
}
}
}
Operators[++Top] = C; //push Operator
S += " ";
break;
case '(' : //操作符
Operators[++Top] = C;
S += " ";
break;
case ')' : //操作符
while (Top >= 0) //栈不为空时
{
char c = Operators[Top--]; //pop Operator
if (c == '(')
{
break;
}
else
{
S = S + c;
}
}
S += " ";
break;
default : //操作数
S = S + C;
break;
}
}
while (Top >= 0)
{
S = S + Operators[Top--]; //pop Operator
}
System.out.println(S); //后缀
//后缀表达式计算
double[] Operands = new double[S.length()];
double x, y, v;
Top = - 1;
String Operand = "";
for (int i = 0; i < S.length(); i++)
{
char c = S.charAt(i);
if ((c >= '0' && c <= '9') || c == '.')
{
Operand += c;
}
if ((c == ' ' && Operand != "") || i == S.length() - 1)
{
Operands[++Top] = java.lang.Double.parseDouble(Operand) ; //push Operands
Operand = "";
}
if (c == '+' || c == '-' || c == '*' || c == '/')
{
if ((Operand != ""))
{
Operands[++Top] = java.lang.Double.parseDouble(Operand) ; //push Operands
Operand = "";
}
y = Operands[Top--]; //pop 双目运算符的第二操作数 (后进先出)注意操作数顺序对除法的影响
x = Operands[Top--]; //pop 双目运算符的第一操作数
switch (c)
{
case '+' :
v = x + y;
break;
case '-' :
v = x - y;
break;
case '*' :
v = x * y;
break;
case '/' :
v = x / y; // 第一操作数 / 第二操作数 注意操作数顺序对除法的影响
break;
default :
v = 0;
break;
}
Operands[++Top] = v; //push 中间结果再次入栈
}
}
v = Operands[Top--]; //pop 最终结果 System.out.println(v); }}
分享到:
相关推荐
利用堆栈实现括号匹配 堆栈应用 大括号 小括号
堆栈应用题 要求: 一、 设计一个堆栈类,实现对于软件操作中常用的撤销/重做 (Undo/Redo)的支持。 二、 使用控制台或者图形界面,测试这个堆栈类的使用。
堆栈应用题 要求: 一、 设计一个堆栈类,实现对于软件操作中常用的撤销/重做 (Undo/Redo)的支持。 二、 使用控制台或者图形界面,测试这个堆栈类的使用。
android ImageView的堆栈应用
最简单堆栈简单介绍 初级理解和应用 我自己写的见笑了
07.链式堆栈以及栈的应用.ppt
Java代码实现的堆栈,有入栈,出栈操作,以及堆栈应用中的括号匹配问题,以及编译系统中将后缀表达式的运算
MCS51系列单片机的堆栈及其应用
是高等学校数据结构学习中的重点内容,堆栈的学习
数据结构中用C++编写的关于栈的源代码,对栈和队列的应用,建立栈,出栈等等
堆栈是计算机中重要的数据结构之一,本次课程设计就是要用程序模拟堆栈的实现,我用的是java实现的.
数据结构讲义之堆栈
实验五 堆栈和队列的应用 一、实验目的 掌握堆栈和队列的使用。 二、实验内容 1、计算数学表达式的值。 输入数学表达式,输出表达式的计算结果。数学表达式由单个数字和运算符“+”、“-”、“*”、“/”、“(、...
数据结构(严蔚敏版)P49的括号匹配的代码实现
堆栈应用,表达式求值,浮点数的很不错,代码简洁而易懂
本程序是java堆栈的应用,实现中缀表达式转换成后缀表达式以及结果计算。
java 泛型 容器 堆栈
51单片机的堆栈在开辟的空间、允许进出栈的单元及子程序与中断调用断点等方面有其特殊性.需要针对这些特殊性在编程中特别加以注意.
该文件包括堆栈的头文件(Seq开头)和链表的头文件(Lin开头),另外还实现了十进制转化为八进制、对称串判断和带头结点的单循环链表实现链式队列
用堆栈实现汉诺塔演示的窗口应用程序及其C#源代码