| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 720 人关注过本帖
标题:表达式求值 调了一天, 手打伤不起啊 哪位路过的搭救一下
取消只看楼主 加入收藏
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
结帖率:81.82%
收藏
已结贴  问题点数:5 回复次数:5 
表达式求值 调了一天, 手打伤不起啊 哪位路过的搭救一下
//利用栈编写表达式求值程序:输入含有“+”、“-”、“*”、“/”四则运算的表达式,
//其中负数要用(0-正数)表示,
//并以#结束。要求输出表达式的值

#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define    OVERFLOW -2
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量

typedef int SElemType; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等

struct SqStack1
{
     SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
     SElemType *top; // 栈顶指针
     int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈


struct SqStack2
{
     char *base; // 在栈构造之前和销毁之后,base的值为NULL
     char *top; // 栈顶指针
     int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈


Status InitStack1(SqStack1 &S)      
{      
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE

    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));                                        //动态分配注意前后括号的内容,区分线性和链式两种
    if(!S.base)exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status InitStack2(SqStack2 &S)      
{      
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE

    S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));                                        //动态分配注意前后括号的内容,区分线性和链式两种
    if(!S.base)exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status Push1(SqStack1 &S,SElemType e)   
{
// 在栈S中插入元素e为新的栈顶元素
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base)exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top=e;
    *S.top++;
    return OK;

   
}
Status Push2(SqStack2 &S,char e)   
{
// 在栈S中插入元素e为新的栈顶元素
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
        if(!S.base)exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top=e;
    *S.top++;
    return OK;

   
}

Status Pop1(SqStack1 &S,SElemType &e)   
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    S.top--;
    return OK;

   
}
Status Pop2(SqStack2 &S,char &e)   
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    S.top--;
    return OK;

   
}

Status GetTop1(SqStack1 S)   
{
// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
    SElemType e;
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    return e;

   
}
Status GetTop2(SqStack2 S)   
{
// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
    char e;
    if(S.top==S.base)
        return ERROR;
    e=*(S.top-1);
    return e;

   
}




Status Operate(int a,char theta, int b)                                    //计算函数,此处要注意的是a,b都是字符,是char类型函数中做出相应的转化
{   
    a=a;
    b=b;
    if(theta=='+')
        return a+b;
    else if(theta=='-')
        return a-b;
    else if(theta=='*')
        return a*b;
    else if(theta=='/')
        return a/b;
    else
        return ERROR;
}

Status In(char c)
{
    if((c>='0')&&(c<'9'))
        return ERROR;
    else
        return OK;
}


char Bijiao(char a,char c)                                    //a为符号帐顶元素,c为新输入的帐的元素,此函数确定运算符之间的优先级
{
    if(a=='+')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '>';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='-')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '<';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='*')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '>';
        else if(c=='/')return '>';
        else if(c=='(')return '<';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='/')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '>';
        else if(c=='/')return '>';
        else if(c=='(')return '<';
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='(')
    {
        if(c=='+')        return '<';
        else if(c=='-')return '<';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '<';
        else if(c==')')return '=';
        else if(c=='#')return ERROR;
    }
   
    if(a==')')
    {
        if(c=='+')        return '>';
        else if(c=='-')return '>';
        else if(c=='*')return '>';
        else if(c=='/')return '>';
        
        else if(c==')')return '>';
        else if(c=='#')return '>';
    }
    if(a=='#')
    {
        if(c=='+')        return '<';
        else if(c=='-')return '<';
        else if(c=='*')return '<';
        else if(c=='/')return '<';
        else if(c=='(')return '<';
   
        else if(c=='#')return '=';
    }
    return 0;
}

Status StackTraverse1(SqStack1 S)
{
// 从栈顶到栈底依次输出栈中的每个元素
    SElemType *p = (SElemType *)malloc(sizeof(SElemType));
    p = S.top;                                                        //这个地方还不用p=S。top-1,因为后续已经有减1的
   
        printf("The Stack is: ");
        p--;                                                                //已经在此处减1
        while(p>=S.base)                                                    //等于base还需输出 否则少一个,base还有数据域                                       
        {
            printf("%d ", *p);
                         //请填空
            p--;
        }

    printf("\n");
    return OK;
}

 
Status StackTraverse2(SqStack2 S)
{
// 从栈顶到栈底依次输出栈中的每个元素
    char *p = (char *)malloc(sizeof(char));
    p = S.top;                                                        //这个地方还不用p=S。top-1,因为后续已经有减1的
   
        printf("The Stack is: ");
        p--;                                                                //已经在此处减1
        while(p>=S.base)                                                    //等于base还需输出 否则少一个,base还有数据域                                       
        {
            printf("%c ", *p);
                         //请填空
            p--;
        }

    printf("\n");
    return OK;
}



Status Evaluate()                                                //表达式求值的算术优先算法,符帐OPTR,数帐OPND,OP为运算符集合
{
   
    SqStack2 OPTR;
    SqStack1 OPND;
    char c,x,theta;
    int a,b;
    InitStack2(OPTR);Push2(OPTR,'#');

    InitStack1(OPND);c=getchar();//Push1(OPND,c);

    //StackTraverse2(OPTR);        
    //StackTraverse1(OPND);
    while(c!='#'||GetTop2(OPTR)!='#')                            //Gettop不能直接用整形那个
    {
        if(!In(c)){Push1(OPND,c-'0');c=getchar();/*StackTraverse1(OPND);printf("%d\n",GetTop1(OPND));*/}                    //不是运算符的进帐,即数进数帐
        else
            switch(Bijiao(GetTop2(OPTR),c))
        {    //printf("%c\n",GetTop2(OPTR));
            case'<':
                Push2(OPTR,c);
            printf("%c\n",GetTop2(OPTR));
                c=getchar();
                break;
            case'=':
                Pop2(OPTR,x);
                c=getchar();
                break;
            case'>':
                Pop2(OPTR,theta);
                Pop1(OPND,b);
                Pop1(OPND,a);
                Push1(OPND,Operate(a,theta,b));
            //    printf("%d\n",GetTop1(OPND));
                break;
        }
    }
    StackTraverse2(OPTR);
    printf("%d\n",GetTop1(OPND));
   
    return GetTop1(OPND);
}
int main()
{
        Evaluate();
        
        return 0;
}


说明:是利用帐来做的,其中有关1的都是数帐,而2的是表示符号帐,注释掉的那些是用来调的~谢谢  
搜索更多相关主题的帖子: 表达式 include 存储 
2013-04-04 10:03
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 2楼 笑傲
谢谢  但是有些测试数据不知为什么过不了  即没有结果输出  如3*(9-7)#   和9-(9-7)#等
2013-04-05 00:54
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 4楼 笑傲
原来是这里   改完之后可以跑了   但是过oj的时候还是提示error  不知闹哪样
2013-04-06 09:22
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 4楼 笑傲
应该是要求多位数的  题目没有明确是几位数的  回头再调调  谢谢~
2013-04-06 13:51
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 7楼 笑傲
应该是多位数的问题  改完之后OK了  谢谢受教了
2013-04-10 23:14
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
收藏
得分:0 
回复 8楼 支风儿
谢谢
2013-04-10 23:15
快速回复:表达式求值 调了一天, 手打伤不起啊 哪位路过的搭救一下
数据加载中...
 
   



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

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