| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 255 人关注过本帖
标题:【栈求表达式的值】求助!调试能发现问题出处,但是自己却看不出哪里问题更 ...
只看楼主 加入收藏
wcmk21
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2013-3-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
【栈求表达式的值】求助!调试能发现问题出处,但是自己却看不出哪里问题更不知到怎么改
有道题是利用栈求算术四则运算表达式,我写了一个代码,但是结果不对,请高手指点!
我调试的时候用的是:12+1#<CR>,先不管更多运算符,只求这个最简单的表达式求值正确,
调试时可以看到Pop函数没有正确的取到数字,但是自己实在没找到问题在哪,拜托了!
》》使用codeblocks用c语言编写
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define INIT_SIZE 50
#define INCREMENT 10
//定义栈
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}MyStack;
void InitStack(MyStack *s)
{
    s->base=(int *)malloc(INIT_SIZE*sizeof(int));
    if(!s->base) exit(-1);
    s->top=s->base;
    s->stacksize=INIT_SIZE;
}
//获取栈顶元素
char GetTop(MyStack *s)
{
    if(s->base==s->top)
    {
        printf("当前栈中无任何元素!\n");
        return -1;
    }
    return *(s->top-1);
}
//进栈操作
void Push(MyStack *s,int e)
{
    if((s->top-s->base)>=s->stacksize)
    s->base=(int *)realloc(s->base,(s->stacksize+INCREMENT)*sizeof(int));
    if(!s->base) exit(-1);
    *s->top=e;
    s->top++;
}
//出栈操作
void Pop(MyStack *s,int et)
{
    if(s->top==s->base)
    {
        printf("当前栈中无任何元素!\n");
        return;
    }
    s->top--;
    et =*s->top;
}
//判断运算符的优先级
char compare(MyStack *s,char sen)
{
    char fir=GetTop(s);
    if(sen=='#')
    {
        if(fir=='#')
            return '=';
        else
            return '<';
    }
    if(sen=='(')
        return '<';
    if(sen==')')
    {
        if(fir=='(')
           return '=';
        else
            return '>';
    }
    if(sen=='+'||sen=='-')
    {
        if(fir=='('||fir=='#')
            return '>';
        else
            return '<';
    }
    if(sen=='*'||sen=='/')
        if(fir=='*'||fir=='/'||fir==')')
            return '<';
        else
            return '>';
    else return -1;
}
//根据符号计算a与b
int getresult(int a,char opc,int b)
{
    switch(opc)
    {
        case '+':return a+b;
        case '-':return a-b;
        case '*':return a*b;
        case '/':return a/b;
    }
    return -1;
}
int main()
{
    //num临时变量,将输入的字符数字转换成数字
    //numa,numb要计算的两个数的
    //op操作符
    int num=0,numa=0,numb=0,op=0;
    //定义运算数栈和运算符栈
    MyStack snum,schar;
    InitStack(&snum);
    InitStack(&schar);
    Push(&schar,'#');
    printf("请输入算术运算表达式:\n");
    char inchar;
    inchar=getchar();
    while(inchar!='#'||GetTop(&schar)!='#')
    {
        //判断是否位数字,是的话则连续取数字字符并转换为整形
        if(isdigit(inchar))
        {
            num=inchar-'1'+1;
            inchar=getchar();
            while(isdigit(inchar))
            {
                num=num*10+(inchar-'1'+1);
                inchar=getchar();
            }
            printf("%d\n",num);
            Push(&snum,num);
        }
        //是运算符的情况
        switch(compare(&schar,inchar))
        {
            case '>':Push(&schar,inchar);inchar=getchar();break;
            case '=':Pop(&schar,inchar);inchar=getchar();break;
            case '<':
                Pop(&schar,op);
                Pop(&snum,numb);
                Pop(&snum,numa);
                Push(&snum,getresult(numa,(char)op,numb));break;
            default:printf("输入错误!\n");return -1;
        }
    }
    Pop(&snum,num);
    printf("%d",num);
    getchar();
    return 0;
}

[ 本帖最后由 wcmk21 于 2014-3-29 10:07 编辑 ]
搜索更多相关主题的帖子: 表达式 include c语言 
2014-03-29 10:04
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:20 

//出栈操作   --- 应该取出栈中的数据,参数et,应该是指针,其他的你自己试着改一改
void Pop(MyStack *s,int *et)
{
    if(s->top==s->base)
    {
        printf("当前栈中无任何元素!\n");
        return;
    }
    s->top--;
    *et =*s->top;
}
2014-03-29 10:53
wcmk21
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2013-3-17
收藏
得分:0 
回复 2楼 ying8501
谢谢,最近昏了头了,连复制传参都忽略了。
2014-03-29 11:25
快速回复:【栈求表达式的值】求助!调试能发现问题出处,但是自己却看不出哪里问 ...
数据加载中...
 
   



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

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