#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
typedef struct{
ElemType *base;
ElemType *top;
int stacksize;
}Sqstack;
Status StackEmpty(Sqstack S){
if(S.top==S.base) return TRUE;
else return FALSE;
}
Status Initstack(Sqstack &S){
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
void Push(Sqstack &S,ElemType e){ //壓堆疊操作
if((S.top-S.base)>=S.stacksize){
S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));//當堆疊的長度大于存盤空間時重新分配空間
if(!S.base) exit(0); //重新分配時失敗
S.top=S.base+S.stacksize; //重新設定堆疊頂及堆疊的大小資訊
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}
void Pop(Sqstack &S, ElemType &e) { //出堆疊操作
if(StackEmpty(S)) exit (0); //堆疊空處理
e=*--S.top;
}
ElemType GetTop(Sqstack S) { //若堆疊不空,堆疊頂元素存入 e,回傳 OK。否則,退出
ElemType e;
if (StackEmpty(S)) exit (0); //堆疊空時退出
e=*(S.top-1);
return e;
}
Status operatorstack(ElemType c){ //判斷字符是否是運算元
int i=0;
char ctr[]="+-*/";
while(ctr[i]){
if(ctr[i]==c) return TRUE;
i++;
}
return FALSE;
}
Status compare(char s1,char s2){ //比較兩個運算子的優先級
int i=0,j=0;
switch(s1){
case '+':i=1;
case '-':i=1;
case '*':i=2;
case '/':i=2;
case '^':i=3;
}
switch(s2){
case '+':j=1;
case '-':j=1;
case '*':j=2;
case '/':j=2;
case '^':i=3;
}
if(i>=j)return TRUE;
else return FALSE;
}
Status calculation(char a,char b,char e){ //計算
if(a>47) a=atoi(&a);
if(b>47) b=atoi(&b);
switch(e){
case'+': return (a+b);break;
case'-': return (a-b);break;
case'*': return (a*b);break;
case'/': return (a/b);break;
case'^': return (a^b);break;
}
}
ElemType convertpoland(){ //這里運算式前后有#符號
Sqstack S,Q;
char c;
ElemType e,e1,e2,e3;
Initstack(S);
Initstack(Q);
Push(Q,'#');
printf("請輸入運算式并以#結束\n");
c=getchar();
while(c!='#'||GetTop(Q)!='#'){
if(!operatorstack(c)){ //字符str[i]不是運算子,即它是運算元
Push(Q,c);
c=getchar();
}
else{
e=GetTop(S); //取出堆疊頂元素
if(compare(e,c)) { //當堆疊頂符號優先權大于當前符號時,出堆疊
Pop(Q,e1);//取出運算元堆疊的前兩個元素與運算元進行運算
Pop(Q,e2);
e3=calculation(e1,e2,e);
Push(Q,e3); //得到的結果存入運算元堆疊Q
}
else{
Push(S,c); //將運算子存入堆疊中
c=getchar();
}
}
}
while(GetTop(Q)!='#'){ //取出最后結果
return GetTop(Q);
}
}
main(){
int result;
result=(int)convertpoland();
printf("result=%d",result);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/69829.html
標籤:其他技術專區
上一篇:緊急求助
下一篇:2個月自學計算機滴體悟
