计算器

#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<cstdio>
using namespace std;


#define Selemtype char
int const stack_initsize = 100;
int const stackincrement = 10;


typedef struct
{
    Selemtype *elem;
    int top;
    int stacksize;
    int incrementsize;
}Sqstack;


typedef struct
{
    double *elem;
    int top;
    int stacksize;
    int incrementsize;
}Sqnumstack;


void creatstack(Sqstack &S, int maxsize = stack_initsize, int incresize = stackincrement)
{
    //创建一个空栈
    S.elem = new Selemtype[maxsize];
    S.top = -1;
    S.stacksize = maxsize;
    S.incrementsize = incresize;
}


void incrementstack(Sqstack &S)
{
    //扩大空间
    Selemtype *a;
    a = new Selemtype [S.stacksize + S.incrementsize];
    for(int i = 0; i < S.top; i++)
        a[i] = S.elem[i];
    delete[] S.elem;
    S.elem = a;
    S.stacksize += S.incrementsize;
}


int Slength(Sqstack &S)
{
    //返回栈的长度
    return S.top;
}


void Sclear(Sqstack &S)
{
    //清空栈
    while(S.top != -1)
    {
        S.elem[S.top--] = 0;
    }
    delete[] S.elem;
}
bool gettop_sq(Sqstack &S, Selemtype &e)
{
    //若栈不空,用e返回栈顶元素,并返回true,否则返回false
    if(S.top == -1)
        return false;
    e = S.elem[S.top];
    return true;
}


void push_sq(Sqstack &S, Selemtype e)
{
    //插入元素e到栈顶
    if(S.top == S.stacksize-1)
        incrementstack(S);
    S.elem[++S.top] = e;
}


bool pop_sq(Sqstack &S, Selemtype &e)
{
    //若栈不空,删除栈顶元素,用e返回,并返回TRUE,否则返回FALSE
    if(S.top == -1)
        return false ;
    e = S.elem[S.top--];
    return true;
}


bool Sempty(Sqstack &S)
{
    //判断是否为空
    if(S.top == -1)
        return true;
    else return false;
}


void creatnumstack(Sqnumstack &S, int maxsize = stack_initsize, int incresize = stackincrement)
{
    //创建一个空栈
    S.elem = new double[maxsize];
    S.top = -1;
    S.stacksize = maxsize;
    S.incrementsize = incresize;
}


void incrementnumstack(Sqnumstack &S)
{
    //扩大空间
    double *a;
    a = new double [S.stacksize + S.incrementsize];
    for(int i = 0; i < S.top; i++)
        a[i] = S.elem[i];
    delete[] S.elem;
    S.elem = a;
    S.stacksize += S.incrementsize;
}


int Slength(Sqnumstack &S)
{
    //返回栈的长度
    return S.top;
}


void Sclear(Sqnumstack &S)
{
    //清空栈
    while(S.top != -1)
    {
        S.elem[S.top--] = 0;
    }
    delete[] S.elem;
}
bool gettop_nsq(Sqnumstack &S, double &e)
{
    //若栈不空,用e返回栈顶元素,并返回true,否则返回false
    if(S.top == -1)
        return false;
    e = S.elem[S.top];
    return true;
}


void push_nsq(Sqnumstack &S, double e)
{
    //插入元素e到栈顶
    if(S.top == S.stacksize-1)
        incrementnumstack(S);
    S.elem[++S.top] = e;
}


bool pop_nsq(Sqnumstack &S, double &e)
{
    //若栈不空,删除栈顶元素,用e返回,并返回TRUE,否则返回FALSE
    if(S.top == -1)
        return false ;
    e = S.elem[S.top--];
    return true;
}


bool Snempty(Sqnumstack &S)
{
    //判断是否为空
    if(S.top == -1)
        return true;
    else return false;
}
//---------------------------------------------------------------------------------------
//表达式求值


bool precede(char c, char ch)
{
    //判断符号的优先级
    if((c == '*' || c == '/') && (ch == '+' || ch == '-') )
        return true;
    else return false;
}


bool opmember(char ch)
{
    //若ch为运算符,则返回true,否则返回false
    if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
        return true;
    else return false;
}


void transform(char *suffix, char *exp)
{
    //从合法表达式字符串exp求得相应的后缀表达式suffix
    Sqstack S2;
    creatstack(S2, 100, 10);
    push_sq(S2, '#');
    Selemtype *p, ch, c;
    p = exp;
    ch = *p;
    int k = 0;


    while(!Sempty(S2))
    {
        //cout<<"1"<<endl;
        if(!opmember(ch))
            suffix[k++] = ch;
        else
        {
            switch(ch)
            {
            case'(':
                push_sq(S2, ch);
                break;
            case')':
                {
                    pop_sq(S2, c);
                    while(c!='(')
                    {
                        suffix[k++] = c;
                        pop_sq(S2, c);
                    }
                }
            default:
                {
                    while(gettop_sq(S2, c) && precede(c, ch))
                    {
                        suffix[k++] = c;
                        pop_sq(S2, c);
                    }
                    if(ch != '#')
                        push_sq(S2, ch);
                    break;
                }
            }
        }
        if(ch != '#')
            ch = *++p;
    }
    suffix[k] = '\0';
    /*for(int i = 0; i < k; i++)
        cout<<suffix[i];
    cout<<endl;*/
}


double operate(double a, char ch, double b)
{
    //计算a ch b 的结果
    switch(ch)
    {
    case'+':
        return a+b;
    case'-':
        return a-b;
    case'*':
        return a*b;
    case'/':
        {
            if(b != 0)
                return a/b;
            else
                cout<<"error!"<<endl;
            break;
        }
    }


}


double evaluation(char suffix[])
{
    //返回后缀表达式suffix的运算结果
    Sqnumstack S1;
    Selemtype ch = *suffix++;
    double a, b, c = 0;
    creatnumstack(S1, 100, 10);
    double result;
    int i = 1;


    while(ch != '#')
    {
        if(!opmember(ch))
        {
            while(!opmember(ch))
            {
                c = i * (ch-48);
                i++;
                ch = *suffix++;
            }
            push_nsq(S1, c);
        }
        else
        {
            pop_nsq(S1, b);
            pop_nsq(S1, a);
            push_nsq(S1, operate(a, ch, b));
        }
        ch = *suffix++;
    }
    pop_nsq(S1, result);
    return result;
}


int main()
{
    //输入运算式, 计算结果
    char exp[1000], suffix[1000];


    cout<<"please input the expression: ";
    while(cin>>exp)
    {
        memset(suffix,0,sizeof(suffix));
        int len=strlen(exp);
        exp[len]='#';
        transform(suffix, exp);
        cout<<"the result is:";
        cout<<evaluation(suffix)<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值