7-20 表达式转换 (25 分)


历时三个半小时终于完成。

这道题的难点主要是在处理数字前的正负号上,同时还应该注意数字有小数点并且不是一位数字
因为在做题之前同学给我说过这道题,也知道几个坑,所以做题的过程比较顺利。


我的步骤如下:
1、先完成不考虑数字前的正负号的程序。
2、考虑数字前的正负号,完善程序。
通过上面的步骤,做题的过程比较的顺利,把难题变成了简单的的题目。
在第二步的时候比较烧脑,因为我的想法比较简单,就是把所有的可能全都列出来,所以要花很多的时间考虑,验证。


总结

1、考虑问题要全面,在数字前正负号时要尽量列出所有的可能。
2、开始做题时有一个大体的思路就行,不必考虑的很周到。
3、要善于猜测试点。。在考试时测试点不会告诉我们,而是需要自己取探索。

**这个题的一个坑就是,会在有的正数前加正号,但输出的时候不用输出正号。**我就一直没过这个测试点,直到搜到了测试数据。


AC代码
#include <stdio.h>
#include <stdlib.h>
/*** 带有头结点 */
typedef struct Node *Stack;
struct Node{char s;Stack Next;
};
//操作
Stack CreateStack(); //初始化栈
void Push(Stack p,char str); //入栈
int IsEmpty(Stack p); //判断是不是为空
char Pop(Stack p); //出栈
char GetTop(Stack p); //得到栈顶元素
void majoy(Stack p,char *s); //后缀表达式int main()
{Stack p = CreateStack();char S[50] = {0};scanf("%[^\n]",S);majoy(p,S); //得到后缀表达式system("pause");return 0;
}//后缀表达式
void majoy(Stack p,char *S)
{int flag = 0;char *ptr = S;while(*ptr){//处理数字if((*ptr >= '0' && *ptr <= '9') || *ptr == '.') {if(flag) printf(" ");//处理小数点while((*ptr >= '1' && *ptr <= '9') || *ptr == '.'){printf("%c",*ptr);ptr++;flag = 1;}}/* 可有可无,为了防止指针错误可以用这个//处理开始的-5 else if((*ptr == '-' || *ptr == '+') && ptr == S){ptr++;if(*(ptr-1) == '+') printf("");else printf("-");while((*ptr >= '1' && *ptr <= '9') || *ptr == '.'){printf("%c",*ptr);ptr++;flag = 1;}}*///专门处理-5这种情况else if((*ptr == '-' || *ptr == '+') && (*(ptr-1)>'9' || *(ptr-1)<'0') && *(ptr-1) != ')' && (*(ptr+1)>='1' && *(ptr+1)<='9')){ptr++;if(flag) printf(" ");if(*(ptr-1) == '+') printf("");else printf("-");while((*ptr >= '1' && *ptr <= '9') || *ptr == '.'){printf("%c",*ptr);ptr++;flag = 1;}}//处理左括号else if(*ptr == '('){Push(p,*ptr);ptr++;}//处理右括号else if(*ptr == ')'){//将里面的全部抛出while(GetTop(p) != '('){printf(" %c",Pop(p));}Pop(p);ptr++;}//处理加减号else if(*ptr == '-' || *ptr == '+'){//处理空栈,或遇到左括号if(IsEmpty(p) || GetTop(p) == '('){Push(p,*ptr);ptr++;}//全部抛出直到空栈或左括号else{while(!IsEmpty(p)){if(GetTop(p) == '(') break;else printf(" %c",Pop(p));}Push(p,*ptr);ptr++;}}//处理乘除号else if(*ptr == '*' || *ptr == '/'){//处理空栈,或遇到左括号if(IsEmpty(p) || GetTop(p) == '('){Push(p,*ptr);ptr++;}//遇到加减号同上else if(GetTop(p) == '-' || GetTop(p) == '+'){Push(p,*ptr);ptr++;}//处理出栈的情况else{while(!IsEmpty(p) && (GetTop(p) == '*' || GetTop(p) == '/')){if(GetTop(p) == '(') break;else printf(" %c",Pop(p));}Push(p,*ptr);ptr++;}}}//最后输出剩下运算符while(!IsEmpty(p)){printf(" %c",Pop(p));}
}//初始化栈
Stack CreateStack()
{Stack q;q = (Stack)malloc(sizeof(struct Node));q->s = '\0';q->Next = NULL;return q;
}//入栈
void Push(Stack p,char str)
{Stack ptr;ptr = CreateStack();ptr->s = str;ptr->Next = p->Next; //注意指向的位置p->Next = ptr;
}//出栈
char Pop(Stack p)
{Stack ptr;char str;if(IsEmpty(p)){printf("栈空\n");return '\0';}ptr = p->Next;str = ptr->s;p->Next = ptr->Next;free(ptr);return str;
}//判断是不是为空
int IsEmpty(Stack p)
{return (p->Next == NULL);
}//得到栈顶元素
char GetTop(Stack p)
{if(IsEmpty(p)) return '\0';else return p->Next->s;
}

参考文献:https://blog.csdn.net/SiKongPop/article/details/77972879#comments.

7-20 表达式转换 (25 分)相关推荐

  1. 7-20 表达式转换 (25 分)(代码详解+题目分析)

    一:题目 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中 ...

  2. 习题3.11 表达式转换 (25分)

    算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中给出不含空 ...

  3. 7-5 表达式转换 (18 分)

    ** 7-5 表达式转换 (18 分) ** 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后 ...

  4. 7-211 求前缀表达式的值 (25 分)

    7-211 求前缀表达式的值 (25 分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * ...

  5. 2-2 进制转换(Q进制转换成T进制) (25分)

    2-2 进制转换(Q进制转换成T进制) (25分) 给定一个整数Q(2<=Q<=10),一个非空字符串,以及另一个整数T(2<=T<=10),编程要求过滤掉字符串中所有非Q进制 ...

  6. Python 中缀表达式转换后缀表达式

    实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...

  7. 7-20 表达式转换(中缀转后缀)

    7-20 表达式转换 分数 25 作者 DS课程组 单位 浙江大学 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程 ...

  8. 7-29 修理牧场 (25 分)

    7-29 修理牧场 (25 分) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L ​i ​​ 个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是L ...

  9. 5-35 城市间紧急救援 (25分) pat 数据结构

    题目连接 https://pta.patest.cn/pta/test/15/exam/4/question/862 5-35 城市间紧急救援   (25分) 作为一个城市的应急救援队伍的负责人,你有 ...

最新文章

  1. C/C++各种数据类型转换汇总
  2. python3 字符串 和 列表(list)互相转换
  3. UA MATH564 概率论 多元随机变量的变换 理论与应用2
  4. javascript 的 ~ 操作符作用
  5. 【NOI2015】品酒大会【后缀数组】【并查集】
  6. 对esp和ebp分析来了解函数的调用过程
  7. Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承
  8. Nginx的HTTP运行时健康检查
  9. 基准风险因子暴露度_具有性能基准SQL Server索引填充因子
  10. C#一次性删除委托中的所有方法
  11. Jupyter Notebook中未显示Conda环境
  12. varnish在Debian9.4安装和配置
  13. 日志服务(原SLS)新功能发布(5)--使用Logstash接入数据
  14. 看我用ubuntu virtualbox
  15. java软件工程师月薪多少?
  16. 局域网助手_IP地址管理和局域网远程助手
  17. 技术文化和惨淡命运 —— 怀念中国雅虎----转载
  18. 3dmax计算机组装动画,3dmax怎么做动画,教你3dsmax动画制作流程和基本套路
  19. 【HTML】设置页面字体
  20. 汽车驱动力及发动机转矩曲线在python中拟合

热门文章

  1. Python3快速入门教程-zyiz.net
  2. 软件项目管理MOOC(北邮)——第一章测试答案
  3. HTML span 标签 的详细用法
  4. android extra_shortcut_icon,Android自动创建shortcut
  5. 从零开始学统计 07 | 标准误差
  6. 存储知识 -- 什么是LUN?LUN有什么用?对理解存储设备很有好处
  7. 外贸企业电子邮箱哪个好?外贸邮箱怎么选择?
  8. Axure设置导航栏控制页面切换
  9. 安装ruby-2.3.1
  10. 如何理解卷积(Convolution)?