#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR -1
typedef struct{ //定義順序堆疊的存盤結構
char *base;
char *top;
int stacksize;
}SqStack;
typedef struct{ //定義順序堆疊的存盤結構
int *base;
int *top;
int stacksize;
}SqStackNum;
void InitStack(SqStack *s) //建空堆疊
{
s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s->base) exit(1);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
void InitStackNum(SqStackNum *s) //建空堆疊
{
s->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s->base) exit(1);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
int GetTop(SqStack s,char *e)
{
if(s.top==s.base) return ERROR;
*e=*(s.top-1);
return 1;
}
int GetTopNum(SqStackNum s,int *e)
{
if(s.top==s.base) return ERROR;
*e=*(s.top-1);
return 1;
}
void push(SqStack *s,char e)
{
if((s->top-s->base)>=s->stacksize) //堆疊已滿,重新分配存盤空間
{
s->base=(char*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
if(!s->base) exit(1);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
}
void pushNum(SqStackNum *s,int e)
{
if((s->top-s->base)>=s->stacksize) //堆疊已滿,重新分配存盤空間
{
s->base=(int*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int));
if(!s->base) exit(1);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
}
int pop(SqStack *s,char *e)
{
if(s->top==s->base) return 0;
*e=*--s->top;
return 1;
}
int popNum(SqStackNum *s,int *e)
{
if(s->top==s->base) return 0;
*e=*--s->top;
return 1;
}
int StackEmpty(SqStack *s)
{
if(s->top==s->base) return 1; //堆疊空,回傳值為1
else return 0;
}
int precede(char c,char e)
{
if((c=='('&&e==')')||(c=='#'&&e=='#')) return 0;
else if((c=='+'&&e=='(')||(c=='-'&&e=='(')||(c=='*'&&e=='(')||(c=='/'&&e=='(')||(c=='+'&&e=='*')||(c=='-'&&e=='*')||(c=='+'&&e=='/')||(c=='-'&&e=='/')) return -1;
else return 1;
}
int operate(int a,char e,int b)
{
switch (e)
{
case '+': return (a+b);
case '-': return (a-b);
case '*': return (a*b);
case '/': return (a/b);
}
}
int EvaluateExpression()
{
SqStack OPTR; SqStackNum OPND;
InitStack(&OPTR);
InitStackNum(&OPND);
push(&OPTR,'#');
int a,b;
char e,c;
c=getchar();
while(c!='#'&&!StackEmpty(&OPTR))
{
if('0'<=c&&c<='9')
{
pushNum(&OPND,(int)c); //為運算元時,直接進堆疊
c=getchar();
}
else
{
GetTop(OPTR,&e);
switch(precede(e,c))
{
case 1: push(&OPTR,c); //堆疊頂元素優先級低
c=getchar();
break;
case 0: pop(&OPTR,&e); //優先級一樣,針對()和##
c=getchar();
break;
case -1:pop(&OPTR,&e); popNum(&OPND,&a);
popNum(&OPND,&b);
pushNum(&OPND,operate((int)a,e,(int)b));
c=getchar();
break;
}
}
}
GetTopNum(OPND,&a);
return (int)a;
}
int main()
{
printf("請輸入算術運算式(結尾加上#,括號輸入用英文):\n");
int a;
a=EvaluateExpression();
printf("結果為:\n");
printf("%c",a);
}
最后運行結果好像總是每個運算式中最后一個數字的值,沒看出來哪寫錯了
在線等!!比較急!謝謝各位!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242603.html
標籤:C語言
上一篇:求助
下一篇:求指點
