编写一个能将中缀表达式转换为后缀表达式的程序。
相关知识
为了完成本关任务,你需要掌握:
中缀表达式转换为后缀表达式的基本原理
如何利用栈实现中缀表达式到后缀表达式的转换。
中缀表达式与后缀表达式
中缀表达式:所有运算符出现在它的两个运算分量之间,如:
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);
}
希望对初学者有所帮助@
本文介绍如何使用栈实现中缀表达式到后缀表达式的转换,通过实例演示步骤,并提供C++代码示例。理解运算符优先级和栈操作在转换过程中的关键作用。
304

被折叠的 条评论
为什么被折叠?



