标题:逆波兰计算器(后缀计算器)
只看楼主
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 10楼 九转星河
是很简单的了。
唯一坑的其实就是输入函数。
负数问题暂时解决了,但不够完美。输入最后一个运算符如果是‘-’的时候,必须手动加一个空格或者多按一个回车,才可以正常运作。
看来还得继续努力。

[此贴子已经被作者于2017-4-7 20:47编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-07 20:19
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
我也做了一个~

感觉你那个负数处理怎么会两个数反了~~~

先不说空格问题~输入4 5-应该得到-1但你那个却得到1~~~

看看我那个效果如何~

就是感觉负数的符号和减号通用这个比较麻烦~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

#define LEN_STACK      sizeof(Stack)
#define LEN_LINKSTACK  sizeof(LinkStack)

#define MAX_SIZE       32     //输入缓冲数据储存容量大小

typedef double ElemType;

typedef struct Stack
{
    ElemType data;
    struct Stack* next;   //栈底指针
}Stack,*PStack;

typedef struct LinkStack  //栈的链接指针
{
    PStack base;
    PStack top;
}LinkStack,*PLinkStack;

void Creat_Stack(PLinkStack* s);               //创建一个栈
void Push_Stack(PLinkStack s,ElemType data);   //进栈
void Pop_Stack(PLinkStack s);                  //出栈
void Del_Stack(PLinkStack s);                  //销毁栈

char Get_Single(PLinkStack s);                 //数据转化并获取运算符号
ElemType Count(PLinkStack s,char c);           //计算数据

int IsEmpty_Stack(PLinkStack s);               //判断栈空

int main()
{
    PLinkStack s=NULL;
    ElemType result=0;

    char c=0;

    Creat_Stack(&s);

    puts("请输入后序表达式:每个数字及运算符号之间用空格隔开:");
    while ((c=Get_Single(s))!='\n')
        Push_Stack(s,Count(s,c));

    result=s->top->data;

    Pop_Stack(s);

//    if (!IsEmpty_Stack(s))
//        puts("输入数据出错!");
//    else
        printf("%.2f\n",result);

    Del_Stack(s);

    free(s);
    s=NULL;

    return 0;
}

void Creat_Stack(PLinkStack* s)
{
    *s=(PLinkStack)malloc(LEN_LINKSTACK);

    if (*s==NULL)
    {
        puts("分配空间出错!");
        exit(0);
    }

    memset(*s,0,LEN_LINKSTACK);

    (*s)->base=(*s)->top=(PStack)malloc(LEN_STACK);

    if ((*s)->base==NULL)
    {
        puts("分配空间出错!");
        exit(0);
    }

    memset((*s)->base,0,LEN_STACK);
}

void Push_Stack(PLinkStack s,ElemType data)   //进栈
{
    PStack p=(PStack)malloc(LEN_STACK);

    if (p==NULL)
    {
        puts("分配空间出错!");
        exit(0);
    }

    p->data=data;

    p->next=s->top;
    s->top=p;
}

void Pop_Stack(PLinkStack s)    //出栈
{
    PStack p=s->top;

    if (IsEmpty_Stack(s))
        return ;

    s->top=s->top->next;

    free(p);
}

void Del_Stack(PLinkStack s)    //销毁栈
{
    while (!IsEmpty_Stack(s))
        Pop_Stack(s);
}
int IsEmpty_Stack(PLinkStack s) //判断栈空
{
    return s->base==s->top;
}

char Get_Single(PLinkStack s)
{
    char c=0;

    while (1)                      //判断是否为负数
    {
        char buff[MAX_SIZE]={0};
           char* p=buff;  

        while (isdigit(c=getchar())||c=='.'||(c=='-'&&p==buff))
            *p++=c;

        if (buff[0]=='-'&&!isdigit(buff[1]))
            Push_Stack(s,Count(s,'-'));
            
        if (c!=' ')
            break;


        if (isdigit(buff[0])||(buff[0]=='-'&&isdigit(buff[1])))
            Push_Stack(s,atof(buff));
    }

    return c;
}

ElemType Count(PLinkStack s,char c)                //计算数据
{
    ElemType a=0;
    ElemType b=0;

    a=s->top->data;
    Pop_Stack(s);

    b=s->top->data;
    Pop_Stack(s);

    switch (c)
    {
        case '+':return b+a;
        case '-':return b-a;
        case '*':return b*a;
        case '/':
            if (b==0)
            {
                puts("除数不能为0");
                exit(0);
            }
            return b/a;
        default:

            puts("输入数据出错!");
            exit(0);
    }

    return 0;
}


[此贴子已经被作者于2017-4-8 15:38编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-08 00:08
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 12楼 九转星河
减法问题我已经修正了,我在九楼说了呀。
减法的问题是我写反了。

[此贴子已经被作者于2017-4-8 01:41编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-08 00:54
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 12楼 九转星河


为什么会等于2,应该等于8才对啊。

5 6 3 - +

换算成中缀应该是 5 + ( 6 - 3)

我研究了一小会儿,没弄清楚问题出在哪儿。

[此贴子已经被作者于2017-4-8 01:27编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-08 01:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 14楼 renkejun1942
最近感觉代码敲多了反而思维混乱了~

改了很久终于改正了bug~

就是感觉负数和减号同用一个运算符号比较麻烦~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-08 15:39
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 15楼 九转星河
现在,我的脑子差不多跟浆糊似的,也许跟你的状态差不多。

完成了中缀计算器(实际上依旧存在圆括号嵌套的BUG),但是一点都不想动,脑子开动不了。

输入问题一直都是一个很大的问题,好吧,这句话我貌似说过很多很多次。

[此贴子已经被作者于2017-4-8 15:47编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-08 15:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475870-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.224796 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved