`
Tveiker
  • 浏览: 55814 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

中缀表达式转后缀表达式(堆栈和队列的应用)

阅读更多
上学的时候没有好好读书,学校留下的实验作业从来就没有做过,每次要交实验报告就去找同学拷贝一份,然后自己做适当修改就提交了。
一学期下来感觉什么也没有,在家里自责之余,写点实验。
对于中缀表达式转为后缀表达式,如果考试
比如
中缀表达式:(8+9*10)-4/2+3
其转化思路:
1、将每个操作符对应的两个操作数用括号括上(((8+(9*10))-(4/2))+3)
2、将操作符移到对应的括号外(((8(910*)+)(42)/)-3)+
3、去掉括号即可  8910*+42/-3+
如果要用数据结构中的栈和队列实现
1、用一个字符串存储表达式
2、扫描字符串。当其为0--9时直接入队列,遇到左括号入栈,操作符级别 #:0用于最后判断,+ -:1,* /:2
3、首先向堆中放一个#,当进入堆的操作符的级别不小于栈顶操作符的优先级,则入栈,否则弹出栈顶元素并进入队列,将下一个操作符压入栈。
4、一直循环直到将所有字符处理完
5、最后将所有元素出队列并打印就可得到后缀表达式
#include<stdio.h>
#define Max 20
//自定义栈
template<class Elem>
struct Stack{
	int top;
	Elem *p;
	int size;
};
template<class Elem>
void Set_Ssize(Stack<Elem> &sta,int n){
	sta.size=n;
	sta.p=new Elem[sta.size];
	sta.top=0;
}
template<class Elem>
void Push(Stack<Elem> &sta,Elem item){
	sta.p[sta.top++]=item;
}
template<class Elem>
void Pop(Stack<Elem> &sta,Elem &e){
	e=sta.p[--sta.top];
}
template<class Elem>
bool IsEmpty(Stack<Elem> &sta){
	return sta.top==0;
}
template<class Elem>
bool IsFull(Stack<Elem> &sta){
	return sta.top==sta.size;
}
//自定义队列
template<class Elem>
struct MyQuene{
	int front;
	int rear;
	Elem *p;
	int size;
};
template<class Elem>
void Set_Qsize(MyQuene<Elem> &Q,int n){
	Q.size=n;
	Q.front=0;
	Q.rear=0;
	Q.p=new Elem[Q.size];
}	
template<class Elem>
void AddQuene(MyQuene<Elem> &Q,Elem item){
	Q.p[Q.rear++]=item;
	if(Q.rear==Q.size)
		Q.rear=0;
}
template<class Elem>
void DeleteQuene(MyQuene<Elem> &Q,Elem& e){
	e=Q.p[Q.front++];
	if(Q.front==Q.size)
		Q.front=0;
}
template<class Elem>
Elem GetTop(Stack<Elem> &sta){
	return sta.p[sta.top-1];
}
template<class Elem>
bool IsEmpty(MyQuene<Elem> &Q){
	return Q.front==Q.rear;
}
template<class Elem>
bool IsFull(MyQuene<Elem> &Q){
	int len=Q.front<Q.rear?Q.rear-Q.front:Q.rear-Q.front+Q.size;
	return len==Q.size-1;
}
//定义运算符的优先级
int GetPrecedence(char a){
	switch(a){
	case '#':return 0;
	case '+':
	case '-':return 1;
	case '*':
	case '/':return 2;
	case '^':return 3;
	default:break;
	}
}
template<class Elem>
void Middle_Bhind(Stack<Elem> &st,MyQuene<Elem>&Mq,char*A,int n){//中缀表达式转为后缀表达式(自己的实验需求)
	Set_Ssize(st,n);
	Set_Qsize(Mq,n+1);
	char tem;
	int i=0;
	Push(st,'#');
	do{
		if((A[i]>='0'&&A[i]<='9')||(A[i]>='A'&&A[i]<='Z')||(A[i]>='a'&&A[i]<='z'))
			AddQuene(Mq,A[i]);
		else if(A[i]=='(')
			Push(st,A[i]);
		else if(A[i]==')'){
			while(GetTop(st)!='('){
				Pop(st,tem);
				AddQuene(Mq,tem);
			}
			Pop(st,tem);
		}
		else if(GetTop(st)=='(')
			Push(st,A[i]);
		else{
			while(GetPrecedence(A[i])<=GetPrecedence(GetTop(st))){
				Pop(st,tem);
				AddQuene(Mq,tem);
			}
			Push(st,A[i]);
		}
		i++;
	}while(A[i]!='\0');
	while(GetTop(st)!='#'){
		Pop(st,tem);
		AddQuene(Mq,tem);
	}
	while(!IsEmpty(Mq)){
		DeleteQuene(Mq,tem);
		printf("%c",tem);
	}
	putchar('\n');
}
void main(){
	char str[Max];
	Stack<char> st;
	MyQuene<char>Mq;
	printf("请输入中缀表达式:");
	gets(str);
	printf("后缀表达式:");
	Middle_Bhind(st,Mq,str,Max);
}
1
0
分享到:
评论

相关推荐

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

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

    c++使用堆栈实现中缀表达式转后缀表达式

    c++使用堆栈实现中缀表达式转后缀表达式

    用堆栈实现中缀转后缀表达式计算课程设计

    在本文中,我们将讨论...总的来说,这个课程设计提供了一个实际应用堆栈数据结构的例子,通过堆栈实现了中缀表达式到后缀表达式的转换以及后缀表达式的计算,展示了如何在程序设计中有效地处理数学表达式的求值问题。

    数学表达式解析器(中缀表达式求值)

    这通常涉及到创建一个运算符栈,遍历中缀表达式,遇到数字时将其添加到输出队列,遇到运算符时与栈顶运算符比较优先级,根据优先级决定是否入栈或输出。 2. **运算符优先级**:理解并定义每个运算符的优先级是至关...

    数据结构实验报告3-栈与队列-中缀表达式求值-实验内容及要求.docx

    ### 数据结构实验报告知识点 #### 实验背景与目标 本次实验是关于数据结构的一个实践...以上是对“数据结构实验报告3-栈与队列-中缀表达式求值”的知识点总结,该实验不仅加深了对栈的理解,还锻炼了编程实践能力。

    数据结构-3期(KC002) 中缀表达式转换为后缀表达式.docx

    总之,中缀表达式转后缀表达式是数据结构中的一个重要应用,它利用了栈和队列这两种基础数据结构的特性,展示了它们在解决实际问题中的灵活性和实用性。理解并掌握这种转换方法,对于编程、算法设计以及计算机科学的...

    Java 实例 - 利用堆栈将中缀表达式转换成后缀表达式源代码-详细教程.zip

    本教程将详细介绍如何利用Java编程语言,通过堆栈数据结构将中缀表达式转换为后缀表达式。 1. **堆栈数据结构**: 堆栈是一种先进后出(Last In First Out,简称LIFO)的数据结构。在处理中缀到后缀转换时,堆栈...

    表达式的求值,栈和队列

    - **中缀表达式转后缀表达式**:将常见的中缀表达式(如 `2 + 3 * 4`)转换为RPN,以便于用栈求值。 - **运算符的关联性和优先级**:了解运算符的结合方向(左关联、右关联)和它们的相对优先级是正确解析表达式的...

    中缀转后缀表达式计算实现源码(C++、Java)

    中缀转后缀表达式的算法主要基于两个数据结构:栈和队列。首先,我们遍历中缀表达式的每一个字符,如果遇到数字,直接输出;如果遇到运算符,我们将其与栈顶的运算符进行比较,根据运算符的优先级决定是入栈还是输出...

    Chapter4-Src_堆栈_

    将中缀表达式转换为后缀表达式,可以通过堆栈来实现,遍历中缀表达式,遇到数字就输出,遇到运算符就与栈顶的运算符比较优先级,根据优先级决定是否压栈或输出。最后,栈中剩余的运算符按逆序输出,即得到后缀表达式...

    简易计算器实习报告

    1. **表达式的结构**:表达式分为中缀表达式和后缀表达式两种。中缀表达式是人们习惯的书写方式,例如 "3 + 4"。后缀表达式也称逆波兰表示法,它不使用括号,运算符位于操作数之后,例如 "3 4 +”。后缀表达式的计算...

    逆波兰表达式

    总的来说,逆波兰表达式是计算机科学中解决计算问题的一种有效工具,它涉及到的数据结构和算法概念如堆栈、队列和链表,都是计算机科学基础中的核心知识点。理解并熟练运用这些知识对于编写高效的代码和解决问题至关...

    数据结构-栈与队列.zip

    5. 中缀表达式转后缀表达式:中缀表达式是我们常用的数学表达式形式,而后缀表达式(也称逆波兰表示法)不需要括号,通过栈来解析和计算。将中缀表达式转换为后缀表达式,可以简化表达式的计算,因为后缀表达式可以...

    栈和队列的算法以及应用

    ### 栈和队列的算法以及应用 ...通过学习栈和队列的算法及其应用,我们可以更好地理解和掌握这两种数据结构的特点和应用场景。在实际开发中,合理选择合适的数据结构可以极大地提高程序的效率和可维护性。

    C语言 栈和队列 栈和队列是两种特殊的线性表,是操作受限的线性表,称限定性DS

    栈的这一特性使其非常适合处理需要回溯的问题,如函数调用的返回地址管理、表达式求值(如中缀表达式转后缀表达式)以及括号匹配等。栈的典型操作包括初始化栈(InitStack)、销毁栈(DestroyStack)、清空栈...

    C++计算数学计算式(内附完整源码及附件).docx

    6. **中缀表达式转后缀表达式**:这个过程遵循了典型的操作符优先级规则,遇到数字直接加入后缀表达式队列,遇到运算符时,根据运算符的优先级决定是否入栈或出栈。左括号直接入栈,右括号时则将所有高于左括号...

    表达式代码,可以输入相关的字符串计算出结果

    栈通常用于后缀表达式(逆波兰表示法)的计算,而队列则适用于中缀表达式的解析。 2. **迭代器**:在遍历表达式字符串时,迭代器可以方便地访问每个字符,执行必要的操作,如识别运算符、操作数和括号。 3. **算法...

    数据结构实验二叉树.doc

    * 主要思路:将原始的中缀表达式转换为后缀表达式,然后利用堆栈计算出表达式的值 * 将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存 * 将分解的中缀表达式转换为后缀表达式的形式 * ...

    大三计算机专业教学+数据结构试题+堆栈树图队列

    5. **中缀到后缀转换**:中缀表达式 (3+4*2)-2/3 转换为后缀表达式为 3 4 * 2 - 3 / -。 这些试题涵盖了数据结构的基本概念,对于理解和掌握数据结构及其算法至关重要,对于准备面试或提高技术能力都非常有帮助。...

Global site tag (gtag.js) - Google Analytics