主要就是看这个函数!!!!CSPop
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<ctype.h>
#include<string.h>
#define MAXSIZE 100
#define ERROR -1
typedef struct CNode*PtrToCNode;
struct CNode
{
char Data[1000];
PtrToCNode Next;
};
typedef PtrToCNode CStack;
//初始化计算栈
CStack cstackinit()
{
CStack S;
S=(PtrToCNode)malloc(sizeof(struct CNode));
S->Next=NULL;
return S;
}
//判断是否为空
bool IsCSEmpty(CStack S)
{
return(S->Next==NULL);
}
//压入
bool CSPush(CStack *S,char*Postfix)
{
PtrToCNode tempt;
tempt=(PtrToCNode)malloc(sizeof(struct CNode ));
strcpy(tempt->Data,Postfix);
tempt->Next=(*S)->Next;
(*S)->Next=tempt;
return true;
}
//弹出这里很容易出错!!!!!
char* CSPop(CStack *S)
{
PtrToCNode C;
char*re;
re=(char*)malloc(1000*sizeof(char));
C=(*S)->Next;
strcpy(re,(*S)->Next->Data);
(*S)->Next=C->Next;
free(C);
return re;
}
//无括号四则运算,思路是把+-看作数字放到堆栈里
char GetOp(char*expr, int*start,char*Postfix)
/*如果是数字和加减则写入栈,如果是运算符返回*/
{
int j=0;
if(isdigit(expr[(*start)]))//读入纯数字
{
while(isdigit(expr[(*start)]))
Postfix[j++]=expr[(*start)++];
//start指向不是数字的部分
Postfix[j]='\0';//构成字符串
return 'n';
}
switch(expr[(*start)++])
{
case '+':
{
Postfix[j]='+';
Postfix[j+1]='\0';
return 'n';}
case '-':
{
Postfix[j]='-';
Postfix[j+1]='\0';
return 'n';}
case '*':
return '*';
case '/':
return '/';
default:
return expr[(*start)];
}
}
//假设运算式子长度不超过100
int calculate()
{
char string[MAXSIZE];
int start=0,sum=0;
CStack S;
S=cstackinit();
printf("请输入你的运算式子:\n");
scanf("%s",string);
while(start<=strlen(string))
{
char Postfix[1000];
char re=GetOp(string,&start,Postfix);
if(re=='*')
{
char tempt1[1000];
GetOp(string,&start,tempt1);
char tempt2[1000];
sprintf(tempt2,"%d",atoi(CSPop(&S))*atoi(tempt1));
CSPush(&S,tempt2);
}
else if(re=='/')
{
char tempt1[1000];
GetOp(string,&start,tempt1);
char tempt2[1000];
sprintf(tempt2,"%d",atoi(CSPop(&S))/atoi(tempt1));
CSPush(&S,tempt2);
}
else if(re=='n')
CSPush(&S,Postfix);
//我写的头昏好想死我快凋谢了
else if (re=='\0')//结束算栈里面的
{
while((S->Next->Next)!=NULL)
{
char tempt3[1000];
strcpy(tempt3,CSPop(&S));
int k=atoi(tempt3);
if(strcmp("+",CSPop(&S))==0)
{
sum+=k;
}
else if(strcmp("-",CSPop(&S))==0)
sum+=(0-k);
}
sum+=atoi(CSPop(&S));
}
}
return sum;
}
//老师我尽力了.......
int main()
{
int result;
result=calculate();
printf("the result is %d\n",result);
}
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<ctype.h>
#include<string.h>
#define MAXSIZE 100
#define ERROR -1
typedef struct CNode*PtrToCNode;
struct CNode
{
char Data[1000];
PtrToCNode Next;
};
typedef PtrToCNode CStack;
//初始化计算栈
CStack cstackinit()
{
CStack S;
S=(PtrToCNode)malloc(sizeof(struct CNode));
S->Next=NULL;
return S;
}
//判断是否为空
bool IsCSEmpty(CStack S)
{
return(S->Next==NULL);
}
//压入
bool CSPush(CStack *S,char*Postfix)
{
PtrToCNode tempt;
tempt=(PtrToCNode)malloc(sizeof(struct CNode ));
strcpy(tempt->Data,Postfix);
tempt->Next=(*S)->Next;
(*S)->Next=tempt;
return true;
}
//弹出
void CSPop(CStack *S,char *re)
{
PtrToCNode C;
C=(*S)->Next;
strcpy(re,(*S)->Next->Data);
(*S)->Next=C->Next;
free(C);
}
//无括号四则运算,思路是把+-看作数字放到堆栈里
char GetOp(char*expr, int*start,char*Postfix)
/*如果是数字和加减则写入栈,如果是运算符返回*/
{
int j=0;
if(isdigit(expr[(*start)]))//读入纯数字
{
while(isdigit(expr[(*start)]))
Postfix[j++]=expr[(*start)++];
//start指向不是数字的部分
Postfix[j]='\0';//构成字符串
return 'n';
}
switch(expr[(*start)++])
{
case '+':
{
Postfix[j]='+';
Postfix[j+1]='\0';
return 'n';}
case '-':
{
Postfix[j]='-';
Postfix[j+1]='\0';
return 'n';}
case '*':
return '*';
case '/':
return '/';
default:
return expr[(*start)];
}
}
//假设运算式子长度不超过100
int calculate()
{
char string[MAXSIZE];
int start=0,sum=0;
CStack S;
S=cstackinit();
printf("请输入你的运算式子:\n");
scanf("%s",string);
while(start<=strlen(string))
{
char Postfix[1000];
char re=GetOp(string,&start,Postfix);
if(re=='*')
{
char tempt1[1000];
GetOp(string,&start,tempt1);
char tempt2[1000];
char du[1000];
CSPop(&S,du);
sprintf(tempt2,"%d",atoi(du)*atoi(tempt1));
CSPush(&S,tempt2);
}
else if(re=='/')
{
char tempt1[1000];
GetOp(string,&start,tempt1);
char tempt2[1000];
char du[1000];
CSPop(&S,du);
sprintf(tempt2,"%d",atoi(du)/atoi(tempt1));
CSPush(&S,tempt2);
}
else if(re=='n')
CSPush(&S,Postfix);
//我写的头昏好想死我快凋谢了
else if (re=='\0')//结束算栈里面的
{
while((S->Next->Next)!=NULL)
{
char tempt3[1000];
char ra[1000];
CSPop(&S,ra);
strcpy(tempt3,ra);
int k=atoi(tempt3);
CSPop(&S,ra);
if(strcmp("+",ra)==0)
{
sum+=k;
}
else if(strcmp("-",ra)==0)
sum+=(0-k);
}
char ra[1000];
CSPop(&S,ra);
sum+=atoi(ra);
}
}
return sum;
}
//老师我尽力了.......
int main()
{
int result;
result=calculate();
printf("the result is %d\n",result);
}