用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
- 用C语言堆栈操作的计算器的实现(输入输出流使用的C++)
- 堆栈的c 语言实现
- 堆栈的C语言实现
- 堆栈的实现(c语言)
- 用C语言实现的计算器
- c 语言的输入输出
- c语言的输入输出
- C语言的输入输出
- C语言的输入输出
- C语言的堆栈
- c语言的堆栈
- C语言实现堆栈(栈)的数据结构
- 堆栈数据结构的C语言实现
- 堆栈数据结构的C语言实现
- c语言和C++输入输出流的基本操作
- 堆栈的简单实现之一:基本操作(C语言实现)
- C语言实现一个简单的计算器
- 一个计算器的C语言实现
- 串行异步通信接口
- Aptana Studio 3 闪退问题解决
- 如何进行面向对象设计
- 计算IMEI号的校验位
- 杂记
- 用C语言堆栈操作的计算器的实现(输入输出流使用的C++)
- 10个最“优秀”的代码注释
- codechef Chef and Swaps
- 10个小故事(转自罗云彬的编程乐园)
- 仲夏之夜
- 网站做到100W用户
- QT中文显示问题(转载)
- Windows加法器
- 面试题12-打印1到最大的n位数