中缀表达式转换为后缀表达式

本文介绍如何使用栈实现中缀表达式到后缀表达式的转换,通过实例演示步骤,并提供C++代码示例。理解运算符优先级和栈操作在转换过程中的关键作用。

编写一个能将中缀表达式转换为后缀表达式的程序。

相关知识
为了完成本关任务,你需要掌握:

中缀表达式转换为后缀表达式的基本原理

如何利用栈实现中缀表达式到后缀表达式的转换。

中缀表达式与后缀表达式
中缀表达式:所有运算符出现在它的两个运算分量之间,如:

31*(5-22)+70

后缀表达式:所有运算符出现在它的两个运算分量后面,如:

31 5 22 - * 70 +

中缀表达式到后缀表达式的转换方法:

初始化一个栈,用于存放运算符,在栈中压人#,#优先级最低。

从左到右遍历中缀表达式的每个数字和符号,若是数字,则输出,成为后缀表达式的一部分,若是符号:

(1)若是左括号,直接压入栈;

(2)若是右括号,则从符号栈弹栈输出,直至弹出左括号(左右括号不输出)

(3)如果遇到任何其他的操作符,从栈中弹出元素直到遇到更低优先级的元素(或者栈中只有#)为止。弹出这些元素后,再将遇到的操作符压入到栈中。

(4)如果我们读到了中缀表达式输入的末尾,则弹出栈中所有元素依次输出。

有一点需要注意,只有在遇到“)”的情况下我们才弹出“(”,其他情况我们都不会弹出" ( "。

编程要求
在右侧编辑器补充代码,将中缀表达式转换为后缀表达式。

测试说明
平台会对你编写的代码进行测试:

测试输入:31*(5-22)+70
预期输出:31 5 22 - * 70 +

测试输入:52+3*21-32/2
预期输出:52 3 21 * + 32 2 / -

说白了也就是创建一个表头作为栈顶的链栈

#include <stdlib.h>
#include <iostream>
#include <stdio.h>
using namespace std;

typedef char DataType;
 
//采用链式栈 
struct node{
    DataType element;  //数据元素 
	struct node *next; //指向下一个数据元素的指针 
};

typedef struct node *PtrToNode;
typedef PtrToNode Stack;
 
/*
   函数名:isEmpty 
   函数功能:判定栈是否为空 
   函数参数:栈头结点指针 
   返回值:若栈为空,则返回1,否则返回0
*/
int isEmpty(Stack s) 
{
    return  s->next ==NULL;
}

/*
   函数名:createStack 
   函数功能:创建一个空栈,实际上只需要初始化栈头结点 
   函数参数:无 
   返回值:栈头结点指针 
*/
Stack createStack(void)  
{
	Stack s ;
	s =new struct node;
	s->next = NULL;
	s->element =0;
	return s;
}

/*
   函数名:push 
   函数功能:向栈中压人一个数据元素值为x 
   函数参数:待压栈的数据元素,栈头结点指针 
   返回值:无
*/
void push(DataType  x,Stack s) 
{
	//表头作为栈顶
    PtrToNode temp ;
 	temp=new struct node;
 	temp->element = x;
 	temp->next = s->next;
 	s->next = temp;
}

/*
   函数名:pop 
   函数功能:弹出栈顶元素并返回元素值 
   函数参数:栈头结点指针 
   返回值:栈顶元素的值 
*/
DataType pop(Stack s) 
{
	PtrToNode temp;
	int t;
	if(isEmpty(s)==0)
  	{
  		temp = s->next;
  		t = temp->element;
  		s->next = temp->next;
  		free(temp);
 		 return t;
 	}
}

DataType top(Stack s) 
{
	if(isEmpty(s)==0)
  	{
    	return s->next->element ;
  	}
}

/*
   函数名:inToPost
   函数功能:将中缀表达式转换为后缀表达式输出 
   函数参数:中缀表达式,放在字符数组中 
   返回值:无 
*/
void inToPost(char *expression)
{
   int i = 0;
   char ch;
   Stack s = createStack();
   push('#',s);
   while(expression[i+1]!='\0')
   {
   		ch = expression[i];
   		if(ch>='0'&&ch<='9'){
			while(ch>='0'&&ch<='9'){
				printf("%c",ch);
				i++;
				ch=expression[i];
				if(expression[i]=='\0')break;
			}
			printf(" ");
			if(expression[i]=='\0')break;
		}
		if(ch=='('){
			push(ch,s);
		}else if(ch=='*' || ch == '/'){
			push(ch,s);
		}else if(ch == '+'  || ch == '-'){
			while(s->next->element!='#' && s->next->element!='(' && s->next->element!=')'){
				printf("%c ",pop(s));
			}
			push(ch,s);
		}else if(ch==')'){
			while(s->next->element!='('){
				printf("%c ",pop(s));
			}
			pop(s);
		}
		i++;
		if((expression[i])=='\0')
			break;
	} 
	if(expression[i]>='0'&&expression[i]<='9')
		printf("%c ",expression[i]);
	while(!isEmpty(s->next)){
		printf("%c ",pop(s));
	}
   /**********  End  **********/
}

int main(void)
{
	char express[80];
	cin>>express ;
	inToPost(express);
}

希望对初学者有所帮助@

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值