题目:用栈实现一位数以内的计算器
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define Status int
#define SElemType char
#include<stdlib.h>
using namespace std;
//顺序栈的存储结构
typedef struct
{
char *base;//栈底指针
char *top;//栈顶指针
int stacksize;//栈可用的最大容量
}SqStack;
//顺序栈的初始化
void InitStack(SqStack &S)
{
//构造一个空栈
S.base=new SElemType[MAXSIZE];
if(!S.base)
printf("存储分配失败\n");
S.top=S.base;
S.stacksize=MAXSIZE;
printf("构造成功\n");
}
//顺序栈的入栈
Status Push(SqStack &S,char e)
{
//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize)
return ERROR; //栈满
*S.top++=e;
return OK; //元素e压入栈顶,栈顶指针加1
}
//顺序栈的出栈
Status Pop(SqStack &S,char &e)
{
//删除S的栈顶元素,用e返回其值
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
//取栈顶元素
SElemType GetTop(SqStack S)
{
//返回s的栈顶元素,不修改栈顶指针
if(S.top!=S.base) //栈非空
return *(S.top-1); //返回栈顶元素的值,栈顶指针不变
}
//判断是否是操作符
int In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return OK;
else
return ERROR;
}
//比较OPRT的栈顶元素和ch的优先级
char Precede(char a,char b)
{
if(a=='+'&&b=='+'||a=='+'&&b=='-'||a=='+'&&b==')'||a=='+'&&b=='#'||a=='-'&&b=='+'||a=='-'&&b=='-'||a=='-'&&b==')'||a=='-'&&b=='#'||a=='*'&&b=='+'||a=='*'&&b=='-'||a=='*'&&b=='*'||a=='*'&&b=='/'||a=='*'&&b==')'||a=='*'&&b=='#'||a=='/'&&b=='+'||a=='/'&&b=='-'||a=='/'&&b=='*'||a=='/'&&b=='/'||a=='/'&&b==')'||a=='/'&&b=='#'||a==')'&&b=='+'||a==')'&&b=='-'||a==')'&&b=='*'||a==')'&&b=='/'||a==')'&&b==')'||a==')'&&b=='#')
return '>';
else if(a=='+'&&b=='*'||a=='+'&&b=='/'||a=='+'&&b=='('||a=='-'&&b=='*'||a=='-'&&b=='/'||a=='-'&&b=='('||a=='*'&&b=='('||a=='/'&&b=='('||a=='('&&b=='+'||a=='('&&b=='-'||a=='('&&b=='*'||a=='('&&b=='/'||a=='('&&b=='('||a=='#'&&b=='+'||a=='#'&&b=='-'||a=='#'&&b=='*'||a=='#'&&b=='/'||a=='#'&&b=='(')
return '<';
else if(a=='('&&b==')'||a=='#'&&b=='#')
return '=';
}
//
char Operate(char a,char c,char b)
{
char m;
a=a-'0';
b=b-'0';
if(c=='+')
m=a+b+'0';
else if(c=='-')
m=a-b+'0';
else if(c=='*')
m=a*b+'0';
else if(c=='/')
m=a/b+'0';
return m;
}
//表达式求值
int EvaluateExpression()
{
//算术表达式求值的算符优先法则,设OPRT
char a,b,c,x;
int sum=1;
SqStack OPND;
SqStack OPTR;
char ch,theta;
InitStack(OPND); //初始化OPND栈
InitStack(OPTR); //初始化OPTR栈
Push(OPTR,'#');
printf("请输入表达式\n"); //将表达式起始符“#”压入OPTR栈
cin>>ch;
sum++;
while(ch!='#'||GetTop(OPTR)!='#') //表达式没有完全扫描完毕或OPTR的栈顶元素不为“#”
{
if(!In(ch))
{
Push(OPND,ch);//ch不是运算符则进OPND栈
cin>>ch;
sum++;
}
else
switch(Precede(GetTop(OPTR),ch)) //比较OPTR的栈顶元素和ch的优先级
{
case '<':
Push(OPTR,ch);
sum++;
cin>>ch; //当前字符压入栈,读入下一个字符
break;
case '>':
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
case '=':
Pop(OPTR,x);
cin>>ch;
sum++;
break;
}
}
return GetTop(OPND)-'0';
}
int main()
{
printf("结果是%d\n",EvaluateExpression());
return 0;
}