代码是最初版的,还没有往深的改,算是一个半成品,只能做加减乘除取余运算,其他功能有时间再加。
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 10
typedef struct
{
char elem[MAXSIZE]; //保存进来的字符型数字元素或运算符
int data[MAXSIZE]; //保存转为数字的数字元素(做的目的是方便计算)
int top;
}SeqStack;
SeqStack *InitStackchar();
int Empty(SeqStack *s); //判空栈
int Push(SeqStack *s,char x); //入栈
int Push1(SeqStack *s,int x); //数字入栈
int Pop(SeqStack *s,char *x); //出栈
int Pop1(SeqStack *s,int *x); //数字出栈
char GetTop(SeqStack *s); //取栈顶
int Exp(); //主要函数
int In(char ch,char *opset); //判断元素是否属于运算符的一种
char compare(char x,char ch); //作对比
int CoutNum(int th2,int th1,char op); //计算
int main()
{
int val;
val=Exp();
printf("%d\n",val);
return 0;
}
SeqStack *InitStackchar()
{
SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));
s->top=-1;
return s;
}
int Empty(SeqStack *s) //判空栈
{
if(s->top==-1) return 1;
else return 0;
}
int Push(SeqStack *s,char x) //入栈
{
if(s->top==MAXSIZE-1) return 0;
else
{
s->top++;
s->elem[s->top]=x;
return 1;
}
}
int Push1(SeqStack *s,int x) //入栈
{
if(s->top==MAXSIZE-1) return 0;
else
{
s->top++;
s->data[s->top]=x;
return 1;
}
}
int Pop(SeqStack *s,char *x) //出栈
{
if(Empty(s)) return 0;
else
{
*x=s->elem[s->top];
s->top--;
return 1;
}
}
int Pop1(SeqStack *s,int *x)
{
if(Empty(s)) return 0;
else
{
*x=s->data[s->top];
s->top--;
return 1;
}
}
char GetTop(SeqStack *s) //取栈顶第一个元素
{
if(Empty(s)) return 0;
else return (s->elem[s->top]);
}
int Exp()
{
int data,val,th2,th1;
char x,op;
char ch,ch1,opset[7]={'+','-','*','/','%','#'};
SeqStack *OPRD,*OPTR;
OPRD=InitStackchar();
OPTR=InitStackchar();
Push(OPTR,'#');
printf("\n\nPlease Input an expression:");
ch=getchar();
ch1=getchar();
while(ch!='#'||GetTop(OPTR)!='#')
{
if(!In(ch,opset)) //将字符型转为整形
{
data=ch-'0';
ch=getchar();
ch1=getchar();
while(!In(ch,opset))
{
data=data*10+ch-'0';
ch=getchar();
ch1=getchar();
}
Push1(OPRD,data);
}
else
{
switch(compare(GetTop(OPTR),ch)) //判断
{
case '<':Push(OPTR,ch);
ch=getchar();
ch1=getchar();break;
case '=':Pop(OPTR,&x);
ch=getchar();
ch1=getchar();break;
case '>':Pop(OPTR,&op);
Pop1(OPRD,&th2);
Pop1(OPRD,&th1);
val=CoutNum(th1,th2,op);
Push1(OPRD,val);
break;
}
}
}
// val=GetTop(OPRD);
return val;
}
int In(char ch,char *opset)
{
int i;
for(i=0;i<7;i++)
{
if(ch==opset[i]) return 1;
}
return 0;
}
char compare(char x,char ch) //顺序不可改变
{
if(x=='*'||x=='/'||x=='%') return '>';
else if(ch=='*'||ch=='/'||ch=='%') return '<';
else if(x=='+'||x=='-') return '>';
else if(ch=='+'||ch=='-') return '<';
else return '=';
}
int CoutNum(int th1,int th2,char op)
{
if(op=='+') return (th1+th2);
else if(op=='-') return (th1-th2);
else if(op=='*') return (th1*th2);
else if(op=='/') return (th1/th2);
else if(op=='%') return (th1%th2);
else return 0;
}
这个代码大部分是从书上搬去过来的,但是书上只给你讲了思路,并没有全部都告诉你。算是有利有弊吧,所以上面的代码看着会比较繁琐,都是我一个字一个字打的,实在不想删,只能在原有代码上加东西。想IN()函数,COMPARE()函数等,都是我自己加的。如果说再给我一次机会的话,不,以后的代码还是先自己理解在打出来,按书上来的实在是太坑了。