#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

char data[5];//運算元 1234.......... 
char opstack[5];//放運算子 
int top=-1,optop=-1;//top紀錄運算元堆疊、optop紀錄運算子堆疊 

char oppop(){
	char sym;
	sym=opstack[optop];
	optop--;
	return sym;
}

void oppush(char strstack){
	opstack[++optop]=strstack;
}
//上方是運算子、下方是運算元 
int pop(){
	int num;
	num=data[top]-'0';
	top=top-1;
	return  num;
}

void push(char strdata){
	data[++top]=strdata;
}



int main(int argc, char *argv[]) {
	char str[25];
	int f=0,i=0;//f為旗標 
	char token='\0';
	int ans,length;
    
    puts("請輸入字串：");
    gets(str);
    length = strlen(str);
    puts("輸入的字串為：");
    printf("字串=%s ; 長度=%d \n",str,length);
    printf("-----------------------\n");
    
    while(f==0){
    	if(str[i]>='0'&& str[i]<='9'){//若是數字丟入運算元陣列 
    		push(str[i]);
    		i++;//i計算算式字串位置 
    		continue;
		}else if(str[i]=='*' || str[i]=='/' || str[i]=='+' || str[i]=='-'){
			if(str[i]=='+' || str[i]=='-'){//若是運算子，先判斷optop運算子堆疊是否有內容 
				if(optop>=0){//有內容才判斷優先權 
					if(opstack[optop]=='*' || opstack[optop]=='/'){
						token=oppop();
						switch(token){
							case '*':
								ans=pop()*pop();
								push(ans);
								break;
							case '/':
								ans=pop()/pop();
								push(ans);
								break;
						}
						oppush(str[i]);	
						i++;	
					}else{//若堆疊內運算子是+-則直接放入 
						oppush(str[i]);
						i++;
					}	
				}else{//運算子堆疊無內容直接放入 
						oppush(str[i]);
						i++;
					}	
			}else{//判斷*/優先權 
				if(optop>=0){//同上方 
					if(opstack[optop]=='*' || opstack[optop]=='/'){
						token=oppop();
						switch(token){
							case '*':
								ans=pop()*pop();
								push(ans);
								break;
							case '/':
								ans=pop()/pop();
								push(ans);
								break;
						}
						oppush(str[i]);	
						i++;	
					}else{
						oppush(str[i]);
						i++;
					}
				}else{
						oppush(str[i]);
						i++;
					}	
			}	
		}else{
			f=1;
		}
	}
	
	while(optop>=0){//最後拿出剩下的運算元堆疊與運算子堆疊倆倆運算 
		token=oppop();
		switch(token){
			case '+':
				ans=pop()+pop();
				push(ans);
				break;
			case '-':
				ans=pop()+pop();
				push(ans);
				break;
			case '*':
				ans=pop()*pop();
				push(ans);
				break;
			case '/':
				ans=pop()/pop();
				push(ans);
				break;
			default:
				ans=pop();
				break;
		}
		optop--;
	}
	
	printf("答案是%d \n",ans);
	
    
    
	return 0;
}