`
trix
  • 浏览: 84864 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

堆栈应用4

阅读更多
中缀表达式到后缀表达式的转换要把表达式从中缀表达式的形式转换成用后缀表示法
表示的等价表达式

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); }}
分享到:
评论

相关推荐

    利用堆栈实现括号匹配 堆栈应用

    利用堆栈实现括号匹配 堆栈应用 大括号 小括号

    堆栈应用题 代码

    4. `isEmptyUndoStack()` 和 `isEmptyRedoStack()`:分别检查撤销和重做堆栈是否为空,用于判断是否可以进行撤销或重做操作。 5. `clear()`: 清空两个堆栈,通常在用户明确要求或程序启动时执行,以确保没有遗留的...

    堆栈应用题

    堆栈应用题 堆栈应用题是软件操作中常用的撤销/重做(Undo/Redo)机制的实现,通过设计一个堆栈类,实现对文件路径和文件名的存储和管理。下面是该堆栈类的详细设计和实现: 1. 类设计: 堆栈类是一个基本的数据...

    堆栈初级理解应用

    ### 堆栈初级理解应用 #### 最简单堆栈简单介绍与初级理解和应用 本文将对堆栈(Stack)的基本概念、工作原理及其简单的Java实现进行详细的解释,并通过一个具体的编程示例来帮助读者更好地理解堆栈的工作机制。 ...

    数据结构课程堆栈知识应用

    根据提供的代码示例,我们可以看到一个典型的堆栈应用场景——**表达式求值**。 1. **中缀转后缀**(`ConvertToPost`): 将输入的中缀表达式转换成后缀表达式。 2. **逆置堆栈**(`Reverse`): 对转换后的表达式进行...

    数据结构-堆栈及其应用-Java代码实现

    数据结构是计算机科学中至关重要的概念,而堆栈(Stack)作为其中的一种基本结构,具有“后进先出”(LIFO,Last In First Out)的特性,广泛应用于各种算法和程序设计中。本主题主要关注Java语言实现的堆栈及其在...

    android ImageView的堆栈应用

    android ImageView的堆栈应用

    07.链式堆栈以及栈的应用.ppt

    07.链式堆栈以及栈的应用.ppt

    堆栈的模拟实现|堆栈的工作过程与应用

    4. **应用程序设计** - **第一个应用程序**:模拟堆栈的基本操作,包括元素的压入和弹出,以及获取堆栈长度等。 - **第二个应用程序**:实现数制转换,利用堆栈的特性将十进制数转换为任意进制。基本思路是反复将...

    MCS51系列单片机的堆栈及其应用

    MCS51系列单片机的堆栈结构和应用是嵌入式系统编程中的重要课题。堆栈是一种数据结构,其基本操作原则是“后进先出”(LIFO)。在MCS51系列单片机中,堆栈的实现和应用与其他计算机系统有所不同,其特点和应用技巧...

    数据结构-堆栈

    本文将详细介绍堆栈的概念、特性以及在实际编程中的应用。 #### 堆栈的定义 堆栈是一种特殊的线性数据结构,它遵循**后进先出**(Last In First Out, LIFO)的原则。这意味着最后被添加到堆栈中的元素将是第一个被...

    labview堆栈实现及堆栈状态机

    在实际应用中,LabVIEW的堆栈状态机可以用于各种场景,比如处理序列操作、实现复杂的控制逻辑,或者在多任务环境中管理任务的执行顺序。通过巧妙地使用堆栈,开发者可以创建出高效且易于理解的程序结构。理解并熟练...

    MCS-51单片机的堆栈及其应用

    ### MCS-51单片机的堆栈及其应用 #### 一、MCS-51系列单片机堆栈的特点与注意点 ##### 1.1 堆栈空间 MCS-51系列单片机采用的是向上生长型堆栈,即随着数据的压入,栈顶逐渐向高位地址移动。这种堆栈被开辟在内部...

    堆栈和队列的应用

    数据结构中用C++编写的关于栈的源代码,对栈和队列的应用,建立栈,出栈等等

    java堆栈的应用--中缀表达式转换成后缀表达式和计算

    在本项目中,“java堆栈的应用--中缀表达式转换成后缀表达式和计算”具体涉及到了两个主要知识点:中缀表达式的转换与后缀表达式的计算。 1. **中缀表达式**:这是我们常见的数学表达式形式,如 `2 + 3 * 4`,其中...

    STM32 堆栈检测示例

    4. **RTOS集成的堆栈监测**:如果使用实时操作系统(RTOS),如FreeRTOS,它通常包含内置的堆栈溢出检测机制。每个任务都有一个分配的堆栈大小,RTOS会监控每个任务的堆栈使用情况,并在溢出时发出警告或采取措施。 ...

    dongzuoji.zip_labview做堆栈_labview有堆栈吗

    堆栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO,Last In First Out)的原则,广泛应用于各种计算任务,如函数调用、内存管理等。 在LabVIEW中,虽然没有内置的“堆栈”数据类型,但可以通过自定义的方式来...

    图片堆栈_matlab处理视频_视频_图片堆栈软件_图片堆栈_

    4. **MATLAB中的图片堆栈操作**: 在MATLAB中,你可以对图片堆栈进行各种操作,比如: - **平均化**:通过对堆栈中的所有图片求平均,可以得到平均图像,常用于减少噪声。 - **动画生成**:将图片堆栈转换为.gif...

    数据结构——堆栈和队列

    在这个主题中,我们将深入探讨两个关键的数据结构:堆栈(Stack)和队列(Queue)。这两个数据结构在编程中扮演着至关重要的角色,特别是在处理算法和程序流程控制方面。 堆栈是一种后进先出(LIFO,Last In First ...

    C++高效获取函数调用堆栈

    C++高效获取函数调用堆栈 在程序设计和开发过程中,出现问题是很正常的。这时候,快速找到问题所在,并确定程序的上下文环境就变得非常...该方法可以广泛应用于程序设计和开发过程中,以提高程序的稳定性和可靠性。

Global site tag (gtag.js) - Google Analytics