版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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.