四则运算器:实现多位整数的带括号的四则运算
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
typedef char StackElementType;
typedef struct
{
StackElementType elem[Stack_Size];
int top;
}SeqStack;
typedef struct
{
int elem[Stack_Size];
int top;
}SeqStack_num;
//初始化栈
void InitStack(SeqStack *S)
{
S->top=-1;
}
void InitStack_num(SeqStack_num *S)
{
S->top=-1;
}
//进栈
int Push(SeqStack *S,StackElementType x)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
int Push_num(SeqStack_num *S,int x)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
}
int Pop_num(SeqStack_num *S,int *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
}
//读栈顶元素
StackElementType GetTop(SeqStack *S)
{
StackElementType x;
if(S->top==-1)
return(FALSE);
else
{
x=S->elem[S->top];
return(x);
}
}
int GetTop_num(SeqStack_num *S)
{
int x;
if(S->top==-1)
return(FALSE);
else
{
x=S->elem[S->top];
return(x);
}
}
//优先级比较函数
/*StackElementType Compare(StackElementType ch,StackElementType ch_temp)
{
char compare[7][7]={
{'<','<','<','<','<','0','>'},
{'<','<','<','<','<','0','>'},
{'>','>','<','<','<','0','>'},
{'>','>','<','<','<','0','>'},
{'>','>','>','>','>','0','>'},
{'<','<','<','<','=','0','0'},
{'<','<','<','<','<','0','0'}
};
int index,index_temp;
switch(ch)
{
case '+':index=0;break;
case '-':index=1;break;
case '*':index=2;break;
case '/':index=3;break;
case '(':index=4;break;
case ')':index=5;break;
case '#':index=6;break;
}
switch(ch_temp)
{
case '+':index_temp=0;break;
case '-':index_temp=1;break;
case '*':index_temp=2;break;
case '/':index_temp=3;break;
case '(':index_temp=4;break;
case ')':index_temp=5;break;
case '#':index_temp=6;break;
}
return(compare[index][index_temp]);
}
*/
StackElementType Compare(StackElementType m,StackElementType n){
switch(m){
case'+':switch(n){
case'+':return '=';
case'-':return '=';
case'*':return '<';
case'/':return '<';
case'#':return '>';
case'(':return '>';
}
case'-':switch(n){
case'+':return '=';
case'-':return '=';
case'*':return '<';
case'/':return '<';
case'#':return '>';
case'(':return '>';
}
case'*':switch(n){
case'+':return '>';
case'-':return '>';
case'*':return '=';
case'/':return '=';
case'#':return '>';
case'(':return '>';
}
case'/':switch(n){
case'+':return '>';
case'-':return '>';
case'*':return '=';
case'/':return '=';
case'#':return '>';
case'(':return '>';
}
case'(':switch(n){
case'+':return '>';
case'-':return '>';
case'*':return '>';
case'/':return '>';
case'#':return '>';
case'(':return '>';
}
default:return '<';
}
}
//主函数
int main()
{
SeqStack_num OVS;
SeqStack OPTR;
InitStack_num(&OVS);
InitStack(&OPTR);//初始化
char ch,ch_temp,op;
int num,v,temp,x;
Push(&OPTR,'#');
printf("Please input an expression(Ending with #):");
ch=getchar();
while(ch!='#'||GetTop(&OPTR)!='#')
{
if(ch>='0'&&ch<='9')//不是操作符,是操作数
{
temp=ch-'0';//先把当前操作数从字符转换成数字
ch=getchar();
while(ch>='0'&&ch<='9')
{
temp=temp*10+ch-'0';
ch=getchar();
}
Push_num(&OVS,temp);
}
else
{
switch(Compare(ch,GetTop(&OPTR)))
{
case '>':Push(&OPTR,ch);ch=getchar();break;
case '=':
case '<':
num=GetTop_num(&OVS);
Pop_num(&OVS,&x);
switch(GetTop(&OPTR)){
case'+':num=GetTop_num(&OVS)+num;break;
case'-':num=GetTop_num(&OVS)-num;break;
case'*':num=GetTop_num(&OVS)*num;break;
case'/':num=GetTop_num(&OVS)/num;break;
}
Pop(&OPTR,&op);
Pop_num(&OVS,&x);
Push_num(&OVS,num);
if(ch==')'){
Pop(&OPTR,&op);
ch=getchar();
}
}
}
v=GetTop_num(&OVS);
}
printf("the result is %d",v);
}
下面是两个失败的例子
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
typedef char StackElementType; //运算符
typedef double StackElementType_num; //运算数
typedef struct
{
StackElementType elem[Stack_Size];
int top;
}SeqStack; //运算符栈
typedef struct
{
StackElementType_num elem[Stack_Size];
int top;
}SeqStack_num; //运算数栈
StackElementType_num ExpEvaluation();
void InitStack(SeqStack *S);
int Push(SeqStack *S,StackElementType x);
int Push_num(SeqStack *S,StackElementType_num x);
int Pop(SeqStack *S,StackElementType *x);
int Pop_num(SeqStack *S,StackElementType_num *x);
int GetTop(SeqStack *S,StackElementType *x);
int GetTop_num(SeqStack *S,StackElementType_num *x);
StackElementType Compare(StackElementType ch1,StackElementType ch2);
StackElementType Execute(StackElementType_num a,StackElementType op,StackElementType_num b);
int main()
{
printf("%lf",ExpEvaluation());
return(0);
}
StackElementType_num ExpEvaluation()
{
char exp[100];//用字符数组将运算表达式存起来
int i=0,count=0;
printf("Please input an expression (Ending with #:)");
exp[i]=getchar();
while(exp[i]!='#')
{
i++;count++;
exp[i]=getchar();
}
SeqStack OPTR;
SeqStack_num OVS;
StackElementType ch,op,x;
StackElementType_num a,b,v;
InitStack(&OPTR);
InitStack(&OVS);
Push(&OPTR,'#');
for(i=0;i<count;i++)
{
ch=exp[i];
while(ch!='#'||GetTop(&OPTR,&x)!='#')
{
if(ch>='0'&&ch<='9')//不是操作符,是操作数,进OVS栈
{
int temp;
temp=ch-'0';//先把当前操作数从字符变为数字
i++;
ch=exp[i];
while(ch>='0'&&ch<='9')//继续判断下一位是否为操作数
{
temp=temp*10+ch-'0';
i++;
ch=exp[i];
}
Push_num(&OVS,temp);//压栈
}
else
switch(Compare(ch,GetTop(&OPTR,&x)))
{
case '>':Push(&OPTR,ch);
i++;ch=exp[i];
case '=':Pop(&OPTR,&op);i++;ch=exp[i];break;//脱括号
case '<':Pop(&OPTR,&op);//形成运算
Pop_num(&OVS,&b);
Pop_num(&OVS,&a);
v=Execute(a,op,b);
Push_num(&OVS,v);
break;
}
}
}
v=GetTop_num(&OVS,&x);
return(v);
}
//初始化
void InitStack(SeqStack *S)
{
/*构造一个空栈S*/
S->top=-1;
}
//进栈
int Push(SeqStack *S,StackElementType x)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
int Push_num(SeqStack *S,StackElementType_num x)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
if(S->top==-1)
return(FALSE);
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
int Pop_num(SeqStack *S,StackElementType_num *x)
{
if(S->top==-1)
return(FALSE);
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
//读栈顶
int GetTop(SeqStack *S,StackElementType *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
return(TRUE);
}
}
int GetTop_num(SeqStack *S,StackElementType_num *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
return(TRUE);
}
}
//比较优先级,返回'>','<','='
StackElementType Compare(StackElementType ch1,StackElementType ch2)
//ch1为还未进栈的运算符,ch2为当前运算符栈顶元素
{
//'('未入栈时,优先级最高,入栈后,优先级最低
int m,n;
switch(ch1)
{
case '(':m=6;break;
case '*':
case '/':m=5;break;
case '+':
case '-':m=4;break;
case ')':m=3;break;
}
switch(ch2)
{
case '*':
case '/':n=6;break;
case '+':
case '-':n=5;break;
case ')':n=4;break;
case '(':n=3;break;
}
if(ch1>ch2)
return('>');
else if(ch1=ch2)
return('=');
else
return('<');
}
StackElementType_num Execute(StackElementType_num a,StackElementType op,StackElementType_num b)
{
StackElementType_num v;
switch(op)
{
case '+':v=a+b;break;
case '-':v=a-b;break;
case '*':v=a*b;break;
case '/':v=a/b;break;
}
return(v);
}
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
typedef char StackElementType;
typedef struct
{
StackElementType elem[Stack_Size];
int Top;
}SeqStack;
void InitStack(SeqStack *S);
int Push(SeqStack *S,StackElementType x);
int Pop(SeqStack *S,StackElementType *x);
int GetTop(SeqStack *S,StackElementType *x);
StackElementType Compare(StackElementType ch1,StackElementType ch2);
StackElementType Execute(StackElementType a,StackElementType op,StackElementType b);
int main()
{
printf("%c",ExpEvaluation());
return(0);
}
StackElementType ExpEvaluation()
{
SeqStack OPTR,OVS;
StackElementType n;
StackElementType a,b,ch,op,x,v;
InitStack(&OPTR);
InitStack(&OVS);
Push(&OPTR,'#');
printf("Please input an expression(Ending with #):");
ch=getchar();//为方便,所以数字也以字符形式来存储
while(ch!='#'||GetTop(&OPTR,&x)!='#')
{
if(ch>='0'&&ch<='9')//不是操作符,是操作数,进OVS栈
{
int temp;
temp=ch-'0';//先把当前操作数从字符变为数字
ch=getchar();
while(ch>='0'&&ch<='9')//继续判断下一位是否为操作数
{
temp=temp*10+ch-'0';
ch=getchar();
}
Push(&OVS,temp);
}
else
switch(Compare(ch,GetTop(&OPTR,&x)))
{
case '>':Push(&OPTR,ch);
scanf("%d",&ch);
case '=':Pop(&OPTR,&op);ch=getchar();break;//脱括号
case '<':Pop(&OPTR,&op);//形成运算
Pop(&OVS,&b);
Pop(&OVS,&a);
v=Execute(a,op,b);
//此处需要将v转换为字符型并且入站
Push(&OVS,v);
break;
}
}
v=GetTop(&OVS,&x);
return(v);
}
//初始化
void InitStack(SeqStack *S)
{
/*构造一个空栈S*/
S->top=-1;
}
//进栈
int Push(SeqStack *S,StackElementType x)
{
if(S->top==Stack_Size-1)
return(FALSE);
S->top++;
S->elem[S->top]=x;
return(TRUE);
}
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
if(S->top==-1)
return(FALSE);
*x=S->elem[S->top];
S->top--;
return(TRUE);
}
//读栈顶
int GetTop(SeqStack *S,StackElementType *x)
{
if(S->top==-1)
return(FALSE);
else
{
*x=S->elem[S->top];
return(TRUE);
}
}
//比较优先级,返回'>','<','='
StackElementType Compare(StackElementType ch1,StackElementType ch2)
//ch1为还未进栈的运算符,ch2为当前运算符栈顶元素
{
//'('未入栈时,优先级最高,入栈后,优先级最低
switch(ch1)
{
case '(':ch1=6;break;
case '*':
case '/':ch1=5;break;
case '+':
case '-':ch1=4;break;
case ')':ch1=3;break;
}
switch(ch2)
{
case '*':
case '/':ch2=5;break;
case '+':
case '-':ch2=4;break;
case ')':ch2=3;break;
case '(':ch2=2;break;
}
if(ch1>ch2)
return('>');
else if(ch1=ch2)
return('=');
else
return('<');
}
StackElementType Execute(StackElementType a,StackElementType op,StackElementType b)
{
double v;
switch(op)
{
case '+':v=(double)a+(double)b;break;
case '-':v=(double)a-(double)b;break;
case '*':v=(double)a*(double)b;break;
case '/':v=(double)a/(double)b;break;
}
return((StackElementType)v);
}