#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 50
struct stack{
char *base;
char *top;
int stacksize;
};
void CreatStack(stack* S);
char GetTop(stack* S, char* e);
void Push(stack* S,char e);
void Pop(stack* S, char &e);
char Precede(char A1,char A2);//判断运算符栈(OPTR)栈顶A1与读入运算符A2的优先级
char Operate(char a,char theta,char b);//用于读取a和b后进行theta运算
bool OPTR(char c, char op[]);//运算符集合OPTR的判断
void CreatStack(stack* S){
S->base = (char *)malloc(sizeof(char)*(STACK_INIT_SIZE));
if(S->base == NULL){
printf("初始化栈失败\n");
return;
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
char GetTop(stack S,char* e){
if(S.base != NULL && S.top != NULL){
*e = *(S.top - 1);
return *e;
}
else
printf("取栈顶元素时出错\n");
}
void Push(stack* S, char e){
if(S->top - S->base >= S->stacksize){
S->base = (char *)realloc(S->base,(S->stacksize + STACK_INIT_SIZE)*sizeof(char));
if(!S->base){
printf("压栈时新建栈失败\n");
return;
}
S->top = S->base + S->stacksize;
S->stacksize += STACK_INIT_SIZE;
}
*S->top++ = e;
return ;
}
void Pop(stack *S, char *e){
if(S == NULL){
printf("弹栈时栈指针不存在\n");
return ;
}
if((S->base == NULL) || (S->top == NULL)){
printf("栈底或栈顶指针为空,出问题\n");
return;
}
*e = *(--S->top);
return;
}
char Precede(char A1,char A2){
if(A1 == '+' || A1 == '-'){
if(A2 == '+' || A2 == '-' || A2 == ')' || A2 == '='){
return '>';
}
else
return '<';
}
if(A1 == '*' || A1 == '/'){
if(A2 == '(')
return '<';
else
return '>';
}
if(A1 == '('){
if(A2 == ')')
return '=';
}
if(A2 == '=')
return 'E';
else
return '<';
if(A1 == ')'){
if(A2 == '('){
return 'E';
}
if(A2 == '=')
return 'E';
else
return '>';
}
if(A1 == '='){
if(A2 == '=')
return '=';
else
return '<';
}
else
return '=';
}
char Operate(char a,char theta,char b){
switch(theta){
case'+':
return a += b;
break;
case'-':
return a -= b;
break;
case'*':
return a *= b;
break;
case'/':
if(b == 0){
printf("除数是0出错!\n");
return -1;
}
return a /= b;
break;
}
return 0;
}
bool judge_OPTR(char c){
char op[7] = {'+','-','*','/','(',')','='};
for(int i = 0; i < 7; i++){
if(op[i] == c)
return true;
}
return false;
}
int main(){
stack OPTR;//运算符栈
stack OPND;
char end = '=';//结束标志
int i = 0;
char e = 0,t = 0, c;
CreatStack(&OPTR);
Push(&OPTR,end);
CreatStack(&OPND);
c = (char)getchar();
while(c != '=' || GetTop(OPTR, &e) != '='){
if(!judge_OPTR(c)){
while(!judge_OPTR(c)){
t = t*10+(c-48);
c = getchar();
}
Push(&OPND,t);
t = 0;
}
else{
switch(Precede(GetTop(OPTR, &e),c)){
case'<':
Push(&OPTR,c);
c = getchar();
break;
case'=':
char x;
Pop(&OPTR,&x);
c = getchar();
break;
case'>':
char b,theta,a;
Pop(&OPTR,&theta);
Pop(&OPND,&b);
Pop(&OPND,&a);
Push(&OPND,Operate(a,theta,b));
break;
case'E':
printf("括号不匹配\n");
break;
}
}
}
char tem = GetTop(OPND, &e);
printf("总和为%d",tem);
return 0;
}
09-18
09-18