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

来源:互联网 发布:精准扶贫大数据平台 编辑:程序博客网 时间:2024/06/05 03:39

#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;}

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

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



0 0