#include <iostream.h>
#include <cstdio>
#include <stdlib.h>
#include <malloc.h>
#define STATCK_INTI_SIZE 100
#define stackingcreement 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int selemtype;
typedef int status;
typedef struct {
selemtype *base;
selemtype *top;
int stacksize;
} sqstack;//定义栈;
typedef struct {
char *base;
char *top;
int stacksize;
} sqstack1;//定义栈;
status initstack(sqstack &s){
//构造一个栈
s.base=(selemtype *)malloc((STATCK_INTI_SIZE)*sizeof(selemtype));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STATCK_INTI_SIZE;
return OK;
}
//初始化一个栈
void push(sqstack &s,selemtype e){
if((s.top-s.base)>=s.stacksize){
//栈满追加空间
s.base=(selemtype *)realloc (s.base,(s.stacksize+STATCK_INTI_SIZE)*sizeof(selemtype));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stackingcreement;
}
*s.top++=e;
}
//出棧
int pop(sqstack &s,selemtype e){
e=*(--(s.top));
return e;
}
//入棧
int gettop(sqstack s){
int e;
e=*(--(s.top));
return e;
}
//以下是用于处理字符的堆栈
status initstack1(sqstack1 &s){
//构造一个栈
s.base=(char *)malloc((STATCK_INTI_SIZE)*sizeof(char));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STATCK_INTI_SIZE;
return OK;
}
void push1(sqstack1 &s,char e){
if((s.top-s.base)>=s.stacksize){
//栈满追加空间
s.base=(char *)realloc (s.base,(s.stacksize+STATCK_INTI_SIZE)*sizeof(char));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stackingcreement;
}
*s.top++=e;
}
//出棧
char pop1(sqstack1 &s,char e){
e=*(--(s.top));
return e;
}
char gettop1(sqstack1 s){
char e;
e=*(--(s.top));
return e;
}
status display(sqstack s)
{
int *p=s.base;
int i=0;
for(i=0;i<(s.top-s.base);i++)
{
printf("%d",*p);
p++;
}
return OK;
}
status display1(sqstack1 s)
{
char *p=s.base;
int i=0;
for(i=0;i<(s.top-s.base);i++)
{
printf("%c",*p);
p++;
}
return OK;
}
//结束
////////以下是关于计算的算法(仅仅能计算一位算数)
status isin(char c)//判断是否是运算符
{
int a;
switch(c)
{
case '+':a=1;break;
case '-':a=1;break;
case '*':a=1;break;
case '/':a=1;break;
case '(':a=1;break;
case ')':a=1;break;
case '#':a=1;break;
default:a=0;break;
}
return a;
}
char precede(char a,char b)//比较运算符的优先级(加法有问题)
{
char c;
switch(a)
{
case '+':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '-':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '*':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='>';break;
case '/':c='>';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '/':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='>';break;
case '/':c='>';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '(':
{
switch(b)
{ case '+':c='<';break;
case '-':c='<';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case ')':c='=';break;
}
}break;
case ')':
{
switch(b)
{ case '+':c='>';break;
case '-':c='>';break;
case '*':c='>';break;
case '/':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '#':
{switch(b)
{
case '+':c='<';break;
case '-':c='<';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case '#':c='=';break;
default:printf("输入错误\n");break;
}
}break;
default:printf("输入错误\n");break;
}
return c;
}
int operate(int a,char thetc,int b)//数字1对应的ASCLL码是48
{
int result;
switch(thetc)
{
case '+':
result=a+b;
break;
case '-':
result=a-b;
break;
case '*':
result=a*b;
break;
case '/':
{
if(b==0)
printf("除数为零,错误\n");
else
result=a/b;
}
}
return result;
}
int evaluateexpression()//算数运算式的解决方案
{
char c;//接受数字
int a,b,e,f;//负责接受需要运算时的数字
char x;//x是专门用于脱去括号
char theta;//theta专门负责用于运算时接受运算符的
sqstack opnd;
sqstack1 optr;
initstack1(optr);push1(optr,'#');
initstack(opnd);c=getchar();
while(c!='#' || gettop1(optr)!='#')
{
if(!isin(c)){
push(opnd,(c-48));
c=getchar();
}//不是运算符就进站
else
switch(precede(gettop1(optr),c))//有问题
{
case '<':{
push1(optr,c);
c=getchar();
}
break;
case '=':{
pop1(optr,x);
c=getchar();
}
break;
case '>':{
theta=pop1(optr,theta);
e=pop(opnd,a);
f=pop(opnd,b);
push(opnd,operate(f,theta,e));
}//有问题
break;
}//switch
}//while
return gettop(opnd);
}
//////////////////算法结束
void main()
{
int k;
k=evaluateexpression();
printf("%d\n",k);
}
输入方法:1+2×3-2#
注意是以#结束.