鱼C论坛

 找回密码
 立即注册
查看: 3388|回复: 9

用栈链实现逆波兰计算法

[复制链接]
发表于 2014-3-8 18:31:48 | 显示全部楼层 |阅读模式
3鱼币
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef char LX;
typedef struct StackNode
{
LX data;
struct StackNode *next;
}StackNode,*LinkStackptr;
typedef struct
{
LinkStackptr top;
int count;
}LinkStack;
void push(LinkStack *s,LX x)
{
StackNode *p;
p=(StackNode *)malloc(sizeof(StackNode));       //调试的时候这里有问题
p->data=x;
p->next=s->top;
s->top=p;
s->count++;
}

void pop(LinkStack *s,LX *x)
{
LinkStackptr p;
*x=s->top->data;
p=s->top;
s->top=p->next;
free(p);
s->count--;
}

int main()
{
LinkStack s,*p;
int i,len;
LX x;
double a,b,res;
LX str[10];
p=&s;
p=(LinkStack *)malloc(sizeof(LinkStack));
s.count=0;
  
printf("请输入一个逆波兰表达式(以'#'结尾): ");
scanf("%c",&x);

while(x!='#')
{
  while(isdigit(x) || x=='.')      //判断输入是否为数字或'.'(小数点)。
  {
   str[i++]=x;
   str='\0';
   if(i>=10)
   {
    printf("输入的数据个数过多!");
   }
   scanf("%c",&x);
   if(x==' ')
   {
    a=atof(str);
    push(&s,a);
    i=0;
    break;
   }
  }
  
  switch(x)
  {
  case '+':
   pop(&s,&b);
   pop(&s,&a);
   push(&s,a+b);
   break;
  case '-':
   pop(&s,&b);
   pop(&s,&a);
   push(&s,a-b);
   break;
  case '*':
   pop(&s,&b);
   pop(&s,&a);
   push(&s,a*b);
   break;
  case '/':
   pop(&s,&b);
   pop(&s,&a);
   if(b==0)
   {
    printf("输入有误,除数不能为0 \n");
   }
   else
    push(&s,a/b);
   break;
  }
  scanf("%c",&x);
}
        //从缓冲区去除'\n'

pop(&s,&res);

printf("运算的结果为: %f\n",res);
return 0;
}


程序可以打开当时输入后按回车就报错!!!求大神指点!!!!!

最佳答案

查看完整内容

你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-8 18:31:49 | 显示全部楼层
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改代码。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef char LX;

typedef struct StackNode
{
        LX data;
        struct StackNode *next;
}StackNode,*LinkStackptr;

typedef struct 
{
        LinkStackptr top;
        int count;
}LinkStack;

void push( LinkStack *s , LX x )
{
        StackNode *p;
        p=(StackNode *)malloc(sizeof(StackNode));       //调试的时候这里有问题
        if( p == NULL )
        {
                perror("push():");
        }
        p->data=x;
        p->next=s->top;
        s->top=p;
        s->count++;
}

void pop(LinkStack *s,int *x)
{
        LinkStackptr p;
        *x = s->top->data - '0';
        p=s->top;
        s->top=p->next;
        free(p);
        s->count--;
}

int main()
{
        LinkStack *s;
        int i = 0, len;
        LX x;
        int a,b,res;
        LX str[10];
        
        s=(LinkStack *)malloc(sizeof(LinkStack));
        s->count=0;
        s->top = NULL;
          
        printf("input:");
        scanf("%c",&x);

        while( x!='#' )
        {
                if( isdigit(x) )      //判断输入是否为数字或'.'(小数点)。
                {
                        if( i >= 9 )              
                        {
                                printf("too much!\n");
                                break;
                        }
                        str[i++]=x;
                        push( s , x );
        
                }
        
                switch( x )
                {
                        case '+': 
                                pop(s,&b);
                                pop(s,&a);
                                push(s,(a+b) + '0');
                                break;
                        case '-':
                                pop(s,&b);
                                pop(s,&a);
                                push(s,(a-b) + '0');
                                break;
                        case '*':
                                pop(s,&b);
                                pop(s,&a);
                                push(s,(a*b) + '0');
                                break;
                        case '/':
                                pop(s,&b);
                                pop(s,&a);
                                
                                if(b==0)
                                {
                                        printf("输入有误,除数不能为0 \n");
                                }
                                else
                                        push(s,(a/b) + '0');
                                break;
                }
          scanf("%c",&x);
        }
        pop(s,&res);

        printf("answer is:%d\n",res);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-9 12:35:35 | 显示全部楼层

首先感谢你回答我的问题,其次这代码纯属黏贴复制只是放上论坛没有修正排版,很抱歉(正常人能这样写代码吗,用脚趾头想想就知道了= =),最后我想说这代码你试过了吗,成功了吗,我试了虽然没报错但是没有输出啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-9 13:03:41 | 显示全部楼层
编辑器:Notepad,编译器:gcc
FQ%OVMB56)9VP{_NZEBC3RM.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-9 13:40:32 | 显示全部楼层
本帖最后由 sidfate 于 2014-3-9 13:54 编辑

谭斌谭斌 发表于 2014-3-9 13:03

编辑器:Notepad,编译器:gcc


发现问题(输出结果是个异常数)所在于这段代码:
while(isdigit(x) || x=='.') //判断输入是否为数字或'.'(小数点)。
{
     str[i++]=x;
     str[i]='\0';
     if(i>=10)
     {
            printf("输入的数据个数过多!");
            return -1;
     }
     scanf("%c",&x);
     if(x==' ')
     {
           c=atof(str);
           push(s,c);
           i=0;
           break;
      }
}

               

这是小甲鱼老师上课给的代码,为什么用在这里会出错,用您的代码结果正确??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-9 13:59:23 | 显示全部楼层
问题不是代码,是思路,那个视频我没看过,他的思路我不清楚,你可以先看看我的代码,看懂了估计发现上段代码错误不会是难事……如果代码有疑问可以告诉我,我会加上注释。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-18 21:07:27 | 显示全部楼层
sidfate 发表于 2014-3-9 13:40
发现问题(输出结果是个异常数)所在于这段代码:

小甲鱼老师的代码是 输入完全符合 逆波兰表达式规则的
而你的输入没有符合逆波兰表达式规则  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-18 21:09:54 | 显示全部楼层
谭斌谭斌 发表于 2014-3-8 18:31
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改 ...

请问你的代码怎么判断小数的  
我怎么感觉你的代码只能针对0~9 的数字进行计算啊???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-18 21:10:58 | 显示全部楼层
谭斌谭斌 发表于 2014-3-8 18:31
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改 ...

我怎么感觉你的代码只能针对0~9 之间的数字进行计算啊?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-17 09:41:18 | 显示全部楼层
LZ你的i没有初始化,补上i=0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 13:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表