四则运算吗?这个我有代码。
/********本程序中在栈中多增加了一个top_temp指针,用来从栈底遍历栈********/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define INITSIZE 10
#define SIZE 100
#define OK 1;
#define ERROR 0;
typedef struct{
int oator;
char orand;
}SElemType;
typedef struct{
SElemType *base;
SElemType *top;
SElemType *top_temp;
int stacksize;
}SqStack;
int InitStack(SqStack *S)
{
S->base=(SElemType *)malloc(SIZE * sizeof(SElemType));
if(!S->base) exit(0);
S->top_temp=S->top=S->base;
S->stacksize=SIZE;
return OK;
}
int Push_oator(SqStack *S,int Oat) //插入栈顶元素算法,整型
{
if(S->top-S->base>=SIZE)
{
S->base=(SElemType *)realloc(S->base,INITSIZE * sizeof(SElemType));
S->top=S->base+S->stacksize;
S->stacksize+=INITSIZE;
}
S->top->oator=Oat;
S->top->orand=0;
S->top++;
return OK;
}
int Push_orand(SqStack *S,char Orand) //插入栈顶元素,字符型
{
if(S->top-S->base>=SIZE)
{
S->base=(SElemType *)realloc(S->base,INITSIZE * sizeof(SElemType));
S->top=S->base+S->stacksize;
S->stacksize+=INITSIZE;
}
S->top->orand=Orand;
S->top->oator=0;
S->top++;
return OK;
}
int GetTop(SqStack *S) //取栈顶元素,返回值为栈顶元素的值
{
if(S->top==S->base) exit(0);
if((S->top-1)->oator==0&&(S->top-1)->orand!=0) //若为操作符
return (S->top-1)->orand; //返回字符
if((S->top-1)->oator!=0&&(S->top-1)->orand==0) //若为操作符
return (S->top-1)->oator; //返回整型
}
int Pop(SqStack *S) //删除top
{
if(S->top==S->base)
return ERROR;
S->top-=1;
S->stacksize--;
return OK;
}
int Prior(char a1,char a2) //优先级比较函数,返回值1时,a2大于a1,返回0,a2等于a1,返回-1,a2小于a1
{
int row,cow;
char r[7]={'+','-','*','/','(',')','#'};
char c[7]={'+','-','*','/','(',')','#'};
int PriorTable[7][7]=
{
-1,-1, 1, 1, 1,-1,-1,
-1,-1, 1, 1, 1,-1,-1,
-1,-1,-1,-1, 1,-1,-1,
-1,-1,-1,-1, 1,-1,-1,
1, 1, 1, 1, 1, 0, 2,
-1,-1,-1,-1, 2,-1,-1,
1, 1, 1, 1, 1, 2, 0
};
for(row=0;a2!=r[row];row++);
for(cow=0;a1!=r[cow];cow++);
return PriorTable[cow][row];
}
int Calculate(SqStack *S) //表达式计算
{
SqStack Temp,*temp; //定义临时栈,用来存放操作数
int NUM;
InitStack(&Temp);
temp=&Temp; //将temp指向临时栈
while(S->top_temp!=S->top) //当遍历栈指针到达中缀栈顶时停止
{
if(S->top_temp->oator==0&&S->top_temp->orand!=0) //如果取的是操作符,则计算临时操作数栈中的两个元素
{
switch(S->top_temp->orand){
case '+':NUM=(temp->top-2)->oator+(temp->top-1)->oator;Pop(&Temp);Pop(&Temp);break; //计算后删除临时栈中的两个操作数
case '-':NUM=(temp->top-2)->oator-(temp->top-1)->oator;Pop(&Temp);Pop(&Temp);break;
case '*':NUM=(temp->top-2)->oator*(temp->top-1)->oator;Pop(&Temp);Pop(&Temp);break;
case '/':NUM=(temp->top-2)->oator/(temp->top-1)->oator;Pop(&Temp);Pop(&Temp);break;
}
Push_oator(temp,NUM);//将计算结果压入临时栈顶
S->top_temp++;//遍历栈指针自增
}
else { //如果取的是操作数
Push_oator(temp,S->top_temp->oator); //压入临时栈顶
S->top_temp++; //遍历栈指针自增
}
}
S->top_temp=S->base; //将遍历栈指针指向原地
return Temp.base->oator; //返回临操作数栈底元素,即最终计算结果
}
int InputExp(SqStack *S,char *String) //***************转换函数***************
{
int NUM=0,i;
char CHR,*String_temp,*String_NUM,cha;
cha='#';
String_temp=String;//将String_temp指向字符串首元素
SqStack TempStack;
InitStack(&TempStack); //创建操作符栈
Push_orand(&TempStack,cha); // 将#压入操作符栈底
for(;*String_temp!='#';String_temp++) //逐个读字符
{
if(*String_temp<='9'&&*String_temp>='0')//如果字符在0~9之间,将其化为整型,存入NUM中
{
for(String_NUM=String_temp,NUM=0,i=0;*String_NUM<='9'&&*String_NUM>='0'&&*String_NUM!='\0';String_NUM++,i++)
{
NUM=NUM*10+(*String_NUM-'0');
}
String_temp+=i; //字符串指针跳步
Push_oator(S,NUM); //将NUM压入操作数栈顶
}
if(*String_temp=='#')//若字符为‘#’,结束转换过程
{
while(GetTop(&TempStack)!='#') //将操作符栈里的操作符一一取出
{
Push_orand(S,GetTop(&TempStack)); //将操作符栈元素插入中缀栈顶
Pop(&TempStack); //删除操作符栈顶
}
break;
}
else {
CHR=*String_temp;
if(CHR==')')//若为‘)
{
while(GetTop(&TempStack)!='('){ /*比较优先级*/
Push_orand(S,GetTop(&TempStack)); /*将操作符栈元素插入中缀栈顶*/
Pop(&TempStack); /*删除操作符栈顶*/
}
Pop(&TempStack);/*删除‘(’*/
}
else {
switch(Prior(GetTop(&TempStack),CHR))
{
case 1:Push_orand(&TempStack,CHR);break;//后大于前
case -1:while(Prior(GetTop(&TempStack),CHR)==-1){ //比较优先级
Push_orand(S,GetTop(&TempStack)); //将操作符栈元素插入中缀栈顶
Pop(&TempStack); //删除操作符栈顶
};
Push_orand(&TempStack,CHR);break;//将近来的操作符插入操作符栈
}
}
}
}
while(GetTop(&TempStack)!='#'){
Push_orand(S,GetTop(&TempStack)); //将操作符栈元素插入中缀栈顶
Pop(&TempStack); //删除操作符栈顶
}
return OK;
}
int Supp(char *String) //*********************给字符串末尾加上‘#’*********************
{
char *tempString;
tempString=String;
while(*tempString!='\0'){ //最后一个字符是'\0',结束循环
tempString++; //字符串长度自增
}
*tempString='#'; //将'#'赋给字符串最后一个元素
return OK;
}
int OutPut(SqStack &S) //********************输出表达式********************
{
while((&S)->top_temp!=(&S)->top){ //当栈底便利指针等于栈顶指针时,结束
if((&S)->top_temp->oator==0&&((&S)->top_temp->orand!=0))//如果操作数等于0,操作符不等于0,输出操作符
printf("%c ",S.top_temp->orand);
else //否则输出操作数
printf("%d ",S.top_temp->oator);
S.top_temp++; //栈底便利指针自增
}
return OK;
}
int main()
{
SqStack S;
char Exp[20];
int num;
InitStack(&S);
printf("注意:输入表达式时,输入数据类型为整型,除\n\n法运算时应注意两个是之间必须整除,否则出错\n\n请输入要求值的表达式,并按Enter键结束:\n\n");
scanf("%s",Exp);
printf("\n");
Supp(Exp);
InputExp(&S,Exp);
num=Calculate(&S);
printf("转换后的后缀表达式:\n\n");
OutPut(S);
printf("\n\n");
printf("计算后的表达式结果:\n\n");
printf("%d",num);
printf("\n\n");
getchar();
}
温馨提示:答案为网友推荐,仅供参考