| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4325 人关注过本帖
标题:利用入栈和出栈函数怎么进行字符串的运算
只看楼主 加入收藏
wll19901105
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-12-4
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
利用入栈和出栈函数怎么进行字符串的运算
如“1+2*3”  给点思路,入栈和出栈已经写好
搜索更多相关主题的帖子: 字符串 
2012-12-11 14:43
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:10 
严蔚敏数据结构有很详细的思路,主要是设计两个栈,一个是操作数的栈,一个是运算符的栈。还要有个运算符优先级的表。我以前写了个,你看看,应该会对你有帮助。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
    float *base;
    float *top;
    int stack_size;
}sqstack;//操作数栈的声明
typedef struct
{
    char *base;
    char *top;
    int stack_size;
}Sqstack;//运算符栈的声明
/*
**运算符栈的基本操作
*/
int Initstack1(Sqstack &OPTR)
{
    OPTR.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!OPTR.base)
        return 0;
    OPTR.top=OPTR.base;
    OPTR.stack_size=STACK_INIT_SIZE;
    return 1;
}
int Push1(Sqstack &OPTR,char e)
{
    if(OPTR.top-OPTR.base>=OPTR.stack_size)
    {
        OPTR.base=(char*)realloc(OPTR.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
        if(!OPTR.base)
            return 0;
        OPTR.top=OPTR.base+OPTR.stack_size;
        OPTR.stack_size+=STACKINCREMENT;
    }
    *OPTR.top++=e;
    return 1;
}
int Pop1(Sqstack &OPTR,char &e)
{
    if(OPTR.top==OPTR.base)
        return 0;
    else
        e=*--OPTR.top;
    return 1;
}
char getTop1(Sqstack &OPTR)
{
    if(OPTR.top==OPTR.base)
        return 0;
    else
        return (*(OPTR.top-1));
}

/*
** 操作数栈的基本操作
*/
int Initstack(sqstack &S)
{
    S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
    if(!S.base)
        return 0;
    S.top=S.base;
    S.stack_size=STACK_INIT_SIZE;
    return 1;

}
int Push(sqstack &S,float e)
{
    if(S.top-S.base>=S.stack_size)
    {
        S.base=(float *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(float));
        if(!S.base)
            return 0;
        S.top=S.base+S.stack_size;
        S.stack_size+=STACKINCREMENT;
    }
    *S.top++=e;
    return 1;
}
int Pop(sqstack &S,float &e)
{
    if(S.top==S.base)
        return 0;
    e=*--S.top;
    return 1;
}
float getTop(sqstack &S)
{
    if(S.top==S.base)
        return 0;
    return(*(S.top-1));
}
int In(char c)
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')//这里不要漏写了,要不然影响结果!
        return 1;
    else
        return 0;

}

char Precede(char a,char b)
{
    int i,j;
    char op[8][8]={{' ','+','-','*','/','(',')','#'},{'+','>','>','<','<','<','>','>'},{'-','>','>','<','<','<','>','>'},{'*','>','>','>','>','<','>','>'},{'/','>','>','>','>','<','>','>'},
    {'(','<','<','<','<','<','=',' '},{')','>','>','>','>',' ','>','>'},{'#','<','<','<','<','<',' ','='}};
    for(i=0;i<8;i++)
    {
        if(a==op[i][0])
            break;
    }
    for(j=0;j<8;j++)
    {
        if(b==op[0][j])
            break;
    }
    return op[i][j];

}
float Operate(float a,char theta,float b)//这个没有错!
{
    float c;
    switch(theta)
    {
    case '+':
        c=a+b;
        break;
    case '-':
        c=a-b;
        break;
    case '*':
        c=a*b;
        break;
    case '/':
        c=a/b;
        break;
    }
    return c;
}
float EvalueateExpression(sqstack OPND,Sqstack OPTR)
{
    char c,x,theta;
    float a,b,i;
    Push1(OPTR,'#');
    c=getchar();
    while(c!='#'||getTop1(OPTR)!='#')
    {
        if(!In(c))
        {
            i=(float)(c-48);
            Push(OPND,i);
            c=getchar();
        }
        else
        {
            switch(Precede(getTop1(OPTR),c))
            {
            case '<':
                Push1(OPTR,c);
                c=getchar();
                break;
            case '=':
                Pop1(OPTR,x);c=getchar();
                break;
            case '>':
                Pop(OPND,b);
                Pop(OPND,a);
                Pop1(OPTR,theta);
                Push(OPND,Operate(a,theta,b));
                break;
            }
        }
    }
    return getTop(OPND);
    

}
int main()
{
    float m;
    Sqstack OPTR;
    sqstack OPND;
    Initstack(OPND);
    Initstack1(OPTR);
    printf("please input a expression end with '#',and the number is between 0-9!\n");
    m=EvalueateExpression(OPND,OPTR);
    printf("结果是:%.2f\n",m);
    return 0;
}

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-12-11 15:06
wll19901105
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-12-4
收藏
得分:0 
回复 2楼 一个孩子
int Initstack(sqstack &S)
这个好像不对吧   我用的是gcc编译器  我改成sqstack *s 也不对
2012-12-11 15:37
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:0 
这个没错吧,你那编译有错误么?啥提示,我看看

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-12-11 15:42
wll19901105
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-12-4
收藏
得分:0 
zhan4.c:20: 错误:expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
2012-12-11 15:49
wll19901105
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-12-4
收藏
得分:0 
回复 4楼 一个孩子
zhan4.c:20: 错误:expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
2012-12-11 15:55
wll19901105
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-12-4
收藏
得分:0 
回复 2楼 一个孩子
人呢?这个错误是什么原因啊
2012-12-11 16:33
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:0 
我试了下,我这边没有错误啊,gcc编译器没玩过,不知道咋回事。。。我用的是6.0,没有错误的。

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-12-11 18:52
抽刀断水yj
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:20
专家分:15
注 册:2012-11-27
收藏
得分:10 
回复 2楼 一个孩子
编译通不过啊,大哥,则么回事,我用的是visual c++

主动,自主
2012-12-11 23:14
快速回复:利用入栈和出栈函数怎么进行字符串的运算
数据加载中...
 
   



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

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