| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 430 人关注过本帖
标题:栈的四则运算,求错误在哪。
取消只看楼主 加入收藏
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:2 
栈的四则运算,求错误在哪。
做了个四则运算,居然连1+1都算出来都是负数,看了半天都不知道哪错了,我知道我肯定是做不出来加括号和负数小数的运算了。求解答哪里错了。
代码附上,请看一看。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"

#define MAX 100
typedef struct
{
    int a[MAX];
    int top;
}num_stack;

typedef struct
{
    char b[MAX];
    int top;
}str_stack;

void init_str(str_stack *s) //chu shi hua
{
    s->top =-1;
}
void push_str(str_stack *s,char e) //ya zhan
{
    s->b[++s->top]=e;
}
char pop_str(str_stack *s) //chu zhan
{
    return(s->b[--s->top]);
}
char get_top(str_stack *s,char c)
{
    c=s->b[--s->top];
    return c;
}

// 数栈
void init_num(num_stack *s) //chu shi hua
{
    s->top =-1;
}
void push_num(num_stack *s,char e) //ya zhan
{
    s->a[++s->top]=e;
}
char pop_num(num_stack *s) //chu zhan
{
    return(s->a[--s->top]);
}

int yunsuanfu(char a)    //优先级
{
    switch(a)
    {
        case '+':
            return 1;
        case '-':
            return 1;
        case '*':
            return 2;
        case '/':
            return 2;
        case '#':
            return 0;
        default:
            return 0;
    }
        

}
int count(int a,char b,int c)
{
    switch(b)
    {
        case '+':
            return a+c;
        case '-':
            return a-c;
        case '*':
            return a*c;
        case '/':
            return a/c;
        default:
            return 0;
    }
}


//  pan  duan
void panduan(num_stack *a,str_stack *b,char e[])
{
    int i=0,k;
    char m;
    push_str(b,'#');  //算式后需要加一个#
    while(e[i]!='#')
    {
        if(e[i]>='0'&&e[i]<='9')
        {
            k=e[i]-'0';
            push_num(a,k);
        }

        /*else if(e[i]=='(')
            push_str(b,'(');
        else if(e[i]==')')
            while(b->b[--b->top]!='(')
            {
                push_num(a,count(pop_num(a),pop_str(b),pop_num(a)));
            }
        */
        else if(yunsuanfu(e[i]))
        {
            if(yunsuanfu(e[i])>yunsuanfu(b->b[b->top-1]))
            {
                push_num(a,count(pop_num(a),e[i],e[i+1]-'0'));
                i=i+1;
            }
            if(yunsuanfu(e[i])<=yunsuanfu(b->b[b->top-1]))
            {
                push_num(a,count(pop_num(a),pop_str(b),pop_num(a)));
            }
        }
            i++;
    }
}


void main()
{
    char c[MAX];
    int sum;
    num_stack s1;
    str_stack s2;
    init_str(&s2);
    init_num(&s1);
    printf("请输入计算式 :");
    scanf("%s",c);
    panduan(&s1,&s2,c);
    sum=pop_num(&s1);
    printf("%d",sum);
    system("pause");
}
搜索更多相关主题的帖子: include 
2014-11-26 12:51
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
收藏
得分:0 
回复 2 楼 liao06550107
谢谢了,看了你的修改后,思路一下就清晰了,s->top那里等于的是-1,没有注意到,还有个问题请教你的就是:“e[i]到达表达式#字符,但操作符栈中还有未处理的操作符号或者表达式中运算符不高于操作符栈的字符,则计算”,这里用到continue,continue是强制结束本次循环,但是输入的数都接受完毕了,最后的一个用户函数是怎么工作的?
2014-11-27 13:43
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
收藏
得分:0 
我明白了,最后的‘#’的优先级要比其他的低,所以还能继续运行,谢谢你了
2014-11-28 11:10
快速回复:栈的四则运算,求错误在哪。
数据加载中...
 
   



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

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