PTA 习题3.11 表达式转换

题目描述

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式

输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。

输入格式

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例

2+3*(7-4)+8/4

输出样例

2 3 7 4 - * + 8 4 / +

思路分析

这个题需要用到堆栈,我这里使用的是单向链表实现的堆栈,需要使用头插法,如果不了解可以去我上一篇博客------单链表逆转
先把输入用char数组存起来,然后从头判断,如果是数字就输出,如果是运算符就存到堆栈里,在存的时候判断一下优先级,要确认后一个的优先级比前一个的优先级高。如果遇到括号,就把"(“直接存到堆栈中,遇到”)"事,将()里面的运算符都取出,但是注意括号不要输出。
这个题主要是要考虑的情况比较多,比如首位为负数,只有一个数字等。。

源代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*
中缀字符串转后缀字符串
*/
#define ERROR -1
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
   
   
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Create();
bool isEmpty(List L);
bool Push(List L, ElementType x);
ElementType Pop(List L);
void Change(List L,char s[]);

int main()
{
   
   
    List L=Create();
    char s[21]={
   
   0};
    scanf("%s",&s);
    Change(L,s)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值