数据结构表达式求值有关问题

<span style="font-size:24px;">数据结构表达式求值问题 求代码
就是数据结构课本(严蔚敏)中栈中的一个问题,算法想的挺简单,不过实现起来着实困难,
例:计算 (3 + 2 * 2(1 + 3))

就是建立两个栈一个字符一个数字   判断读入的是符号还是数据时要用ASCII码吗???  希望高手能给个C的源代码!!!!</span>
<span style="font-size:24px;">#include<iostream>
#include<stack>
#include<cctype>
#include<cstring>
using namespace std;
int isopra(char ch);//判断是不是运算符。
int priority(char ch);//判断优先权。
void trans(char *in,char *out);//将字符串转换成后辍学表达式。
int compute(char *chb);//计算
int reback(char ch,int a,int b);//传入一个运算符一两个数字,返回结果。
int main()
{
    char cha[100],chb[100];
    cin>>cha;
    trans(cha,chb);
    cout<<chb<<endl;
    cout<<compute(chb);
}
int isopra(char ch)
{
    switch(ch)
    {
    case '+':
    case'-':
    case'*':
    case'/':
    case'(':
    case')':
        case'%':
    case'\0':
        return 1;
    default:
        return 0;
    }
}
int priority(char ch)
{
    switch(ch)
    {
    case '+':
    case'-':
        return 1;
    case '*':
    case '/':
        case '%':
        return 2;
    default :
        return 0;
    }
}
void trans(char *in,char *out)
{
    stack<char>s;
    s.push('\0');//设它优先权最低,作栈底。
    while(*in!='\0')
    {
        if(isdigit(*in))*out++=*in++;
                //如果是数字,则写入后辍表达式
        else if(isopra(*in))
        {//如果是操作符,
            if(*in=='(')s.push(*in++);//如果是左括号,入栈;
            else if(*in==')')
            {//如果是右括号,将栈里的符号弹出,直到左括号。
                while(s.top()!='(')
                {
                    *out++=s.top();
                    s.pop();
                }
                s.pop();//弹出左括号; 
                in++;//指针移到右括号的后一位。
            }
            else if(priority(*in)>=priority(s.top()))
            {//如果大于栈顶的优先权,入栈。
                s.push(*in++);
            }
            else
            {//否则栈顶元素出栈,赋予后辍式。
                *out++=s.top();
                s.pop();
            }
        }

    }
    while(priority('\0')<priority(s.top()))
    {//元素全部出栈,给后辍式。
                *out++=s.top();
        s.pop();
    }
    *out='\0';//使后辍式成为字符串。
}
int compute(char *chb)
{
    stack<int>num;
    int a,b;
    while(*chb!='\0')
    {
        if(isdigit(*chb))
        {//数字入栈。
            num.push(*chb++-'0');
        }
        else
        {//出两个元素出来计算,压入栈。
            a=num.top();num.pop();
            b=num.top();num.pop();
            num.push(reback(*chb,a,b));
            chb++;
        }
    }
    return num.top();
}</span><span style="font-size:18px;">
</span><strong><span style="font-size:24px;">int reback(char ch,int a,int b)
{
    switch(ch)
    {
        case '+':return b+a;
        case '-':return b-a;
        case '/':return b/a;
        case '*':return b*a;
        case '%':return b%a;
        default:return 0;
    }
}</span></strong>

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值