鱼C论坛

 找回密码
 立即注册
查看: 3243|回复: 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 | 显示全部楼层
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改代码。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>

  4. typedef char LX;

  5. typedef struct StackNode
  6. {
  7.         LX data;
  8.         struct StackNode *next;
  9. }StackNode,*LinkStackptr;

  10. typedef struct
  11. {
  12.         LinkStackptr top;
  13.         int count;
  14. }LinkStack;

  15. void push( LinkStack *s , LX x )
  16. {
  17.         StackNode *p;
  18.         p=(StackNode *)malloc(sizeof(StackNode));       //调试的时候这里有问题
  19.         if( p == NULL )
  20.         {
  21.                 perror("push():");
  22.         }
  23.         p->data=x;
  24.         p->next=s->top;
  25.         s->top=p;
  26.         s->count++;
  27. }

  28. void pop(LinkStack *s,int *x)
  29. {
  30.         LinkStackptr p;
  31.         *x = s->top->data - '0';
  32.         p=s->top;
  33.         s->top=p->next;
  34.         free(p);
  35.         s->count--;
  36. }

  37. int main()
  38. {
  39.         LinkStack *s;
  40.         int i = 0, len;
  41.         LX x;
  42.         int a,b,res;
  43.         LX str[10];
  44.        
  45.         s=(LinkStack *)malloc(sizeof(LinkStack));
  46.         s->count=0;
  47.         s->top = NULL;
  48.           
  49.         printf("input:");
  50.         scanf("%c",&x);

  51.         while( x!='#' )
  52.         {
  53.                 if( isdigit(x) )      //判断输入是否为数字或'.'(小数点)。
  54.                 {
  55.                         if( i >= 9 )              
  56.                         {
  57.                                 printf("too much!\n");
  58.                                 break;
  59.                         }
  60.                         str[i++]=x;
  61.                         push( s , x );
  62.        
  63.                 }
  64.        
  65.                 switch( x )
  66.                 {
  67.                         case '+':
  68.                                 pop(s,&b);
  69.                                 pop(s,&a);
  70.                                 push(s,(a+b) + '0');
  71.                                 break;
  72.                         case '-':
  73.                                 pop(s,&b);
  74.                                 pop(s,&a);
  75.                                 push(s,(a-b) + '0');
  76.                                 break;
  77.                         case '*':
  78.                                 pop(s,&b);
  79.                                 pop(s,&a);
  80.                                 push(s,(a*b) + '0');
  81.                                 break;
  82.                         case '/':
  83.                                 pop(s,&b);
  84.                                 pop(s,&a);
  85.                                
  86.                                 if(b==0)
  87.                                 {
  88.                                         printf("输入有误,除数不能为0 \n");
  89.                                 }
  90.                                 else
  91.                                         push(s,(a/b) + '0');
  92.                                 break;
  93.                 }
  94.           scanf("%c",&x);
  95.         }
  96.         pop(s,&res);

  97.         printf("answer is:%d\n",res);
  98.         return 0;
  99. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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


发现问题(输出结果是个异常数)所在于这段代码:

  1. while(isdigit(x) || x=='.') //判断输入是否为数字或'.'(小数点)。
  2. {
  3.      str[i++]=x;
  4.      str[i]='\0';
  5.      if(i>=10)
  6.      {
  7.             printf("输入的数据个数过多!");
  8.             return -1;
  9.      }
  10.      scanf("%c",&x);
  11.      if(x==' ')
  12.      {
  13.            c=atof(str);
  14.            push(s,c);
  15.            i=0;
  16.            break;
  17.       }
  18. }
复制代码


               

这是小甲鱼老师上课给的代码,为什么用在这里会出错,用您的代码结果正确??
想知道小甲鱼最近在做啥?请访问 -> 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-4-20 18:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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