用C语言堆栈操作的计算器的实现(输入输出流使用的C++)

2 篇文章 0 订阅
2 篇文章 0 订阅

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

#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define STACK_SIZE 100//初始化分配存储空间
#define STACKINCREMENT 5//存储空间增量

typedef int SElemType;

typedef struct SqStack{
    int *base;
    int *top;
    int stacksize;
}SqStack;

int InitStack (SqStack *S)//char
{
    S->base = (SElemType *)malloc(STACK_SIZE*sizeof(SElemType));
    if(!S->base) exit(OVERFLOW);
    S->top = S->base;
    S->stacksize = STACK_SIZE;
    return OK;
}//构造一个空栈


int GetTop(SqStack *S)
{
    if(S->top == S->base) return ERROR;
    return *(S->top-1);
}//返回栈顶元素


int Push(SqStack *S,SElemType e)//插入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;
    return OK;
}


int Pop(SqStack *S,SElemType *e)
{
    if(S->top == S->base) return ERROR;
    *e = *--S->top;
    return OK;
}

char Precede(char x,char y)//判断优先级,x为栈内,y为栈外
{
    if((x=='('&&y==')') || (x=='\n'&&y=='\n'))
        return '=';
    else if((y=='\n'&&x=='(') || (y==')'&&x=='\n') || (y=='('&&x==')'))
        return ERROR;
    else if(((y=='+'||y=='-')&&x!='('&&x!='\n') ||
            ((y=='*'||y=='/')&&x!='-'&&x!='('&&x!='\n'&&x!='+') ||
             y==')' || y=='\n')
        return '>';
    else return '<';
}//判断优先级函数


int In(char c)
{
    if (c=='+' || c=='-' ||
        c=='*' || c=='/' ||
        c=='(' || c==')' || c=='\n')
        return OK;
    else return ERROR;
}
int Operate(int a,char theta,int b)//计算基本表达式
{
    if (theta=='+')
        return a+b;
    if (theta=='-')
        return a-b;
    if (theta=='*')
        return a*b;
    if (theta=='/')
        return a/b;
    return ERROR;
}
int EvaluateExpression()
{
    SqStack OPTR;//用以寄存运算符
    SqStack OPND;//用以寄存操作数
    InitStack(&OPTR); Push(&OPTR,'\n');
    InitStack(&OPND);
    int theta;
    int c;
    int x;//实际没用,只是为了调用pop函数
    int y,a,b;
    int flag = 0;
    c = getchar();
    while (c!='\n' || GetTop(&OPTR)!='\n'){
    if(!In(c)) {
        if (flag == 0){
            Push(&OPND,c-48);//输入整数的时候转换
            c = getchar();//不是运算符则进栈
            flag++;
        }
        else {
            Pop(&OPND,&y);
            y = y*10+int(c-48);
            Push(&OPND,y);
            c = getchar();
        }
    }//if
    else{
            flag = 0;
        switch(Precede(GetTop(&OPTR),c)){
          case '<'://栈顶元素优先权低于栈外元素优先权
             Push(&OPTR,c);
             c = getchar();
             break;
          case '='://脱括号处理
             Pop(&OPTR,&x);//只是为了除去括号
             c = getchar();
             break;
          case '>'://退栈并且把运算结果入栈
             Pop(&OPTR,&theta);
             Pop(&OPND,&b);Pop(&OPND,&a);
             Push(&OPND,Operate(a,theta,b));
             break;
       }//switch
      }//else
    }//while
    return  GetTop(&OPND);
}
int main()
{
     char ch = 'Y';
     while(ch != 'N'){
     cout<<"Please input the expression:"<<endl;
     int answer = EvaluateExpression();
     cout<<"The answer is: "<<answer<<endl;
     cout<<"Would you want answer espression 'Y' or 'N'"<<endl;
     ch = getchar();
     getchar();
     }
     getchar();
     return 0;
}

代码仅供参考,不可以进行浮点数的运算,不支持单目运算,包括整数的+-*/运算。

运行时输入表达式回车即可



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值