| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 430 人关注过本帖
标题:栈的四则运算,求错误在哪。
只看楼主 加入收藏
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
栈的四则运算,求错误在哪。
做了个四则运算,居然连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
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:10 
程序代码:
//为了保持原作者思路,且保证程序正确运行,只做了最小程度修改。
#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)
{
    s->top =-1;
}

void push_str(str_stack *s,char e)

{
    s->b[++s->top]=e;
}

char pop_str(str_stack *s)

{
    //  return(s->b[--s->top]); //错误
    return(s->b[s->top--]);
}

char get_top(str_stack *s)
{
    // c=s->b[--s->top]; //错误
    char c = s->b[s->top];
    return c;
}

// 数栈
void init_num(num_stack *s)
{

    s->top =-1;
}

void push_num(num_stack *s,char e)
{
    s->a[++s->top]=e;
}

char pop_num(num_stack *s)
{
    // return(s->a[--s->top]); //错误
    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;
    }
}

void panduan(num_stack *a,str_stack *b,char e[])
{
    int i=0,k;
    push_str(b,'#');  //算式后需要加一个#
//    while(e[i]!='#') //存在一种情况,假设表达式为1+2*3#,则num_stack中数据为123,
    //str_stack中数据为#+*,此时表达式只剩下字符#,可算式没有计算完,所以还需要判断str_stack
    //栈中的运算符字符是否都弹出计算过了。最后该栈中只剩下#。
    while (e[i]!='#' || get_top(b)!='#')
    {
        if(e[i]>='0'&&e[i]<='9') //字符是数字
        {
            k=e[i]-'0';
            push_num(a,k);
        }
        else if(yunsuanfu(e[i])>yunsuanfu(get_top(b))){ //表达式中运算符更高级,则该字符进操作符栈
            // push_(a,count(pop_num(a),e[i],e[i+1]-'0'));
            push_str(b, e[i]);
        }
        else if(yunsuanfu(e[i])<=yunsuanfu(get_top(b))){ //e[i]到达表达式#字符,但操作符栈中还有未处理的操作符号或者表达式中运算符不高于操作符栈的字符,则计算
            int temp2 = pop_num(a);
            int temp1 = pop_num(a);
            push_num(a,count(temp1,pop_str(b),temp2));
            continue;
        }
        i++;
    }
}

int main(void)
{
    char c[MAX];
    int sum;
    num_stack s1;
    str_stack s2;
    init_str(&s2);
    init_num(&s1);
    printf("请输入计算式(只支持10以内表达式的加减乘除),输入样式:1+2*3#:");
    scanf("%s",c);
    panduan(&s1,&s2,c);
    sum=pop_num(&s1);
    printf("计算结果是:%d\n",sum);
    getchar();
}



[ 本帖最后由 liao06550107 于 2014-11-26 15:40 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2014-11-26 15:24
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
收藏
得分:0 
回复 2 楼 liao06550107
谢谢了,看了你的修改后,思路一下就清晰了,s->top那里等于的是-1,没有注意到,还有个问题请教你的就是:“e[i]到达表达式#字符,但操作符栈中还有未处理的操作符号或者表达式中运算符不高于操作符栈的字符,则计算”,这里用到continue,continue是强制结束本次循环,但是输入的数都接受完毕了,最后的一个用户函数是怎么工作的?
2014-11-27 13:43
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:0 
数据接收完,并不代表表达式计算完!continue不就是为了跳过i++吗。请认证在纸上模拟一下1+2*3#计算机计算过程。

[ 本帖最后由 liao06550107 于 2014-11-27 20:05 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2014-11-27 19:50
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
收藏
得分:0 
我明白了,最后的‘#’的优先级要比其他的低,所以还能继续运行,谢谢你了
2014-11-28 11:10
快速回复:栈的四则运算,求错误在哪。
数据加载中...
 
   



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

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