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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44720323/article/details/101982836

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.

猜你喜欢

转载自blog.csdn.net/weixin_44720323/article/details/101982836