棧的應用--簡單四則運算
阿新 • • 發佈:2019-01-03
思想:我們平時輸入的四則運算表示式,例如:9*(3-1)+2,屬於中綴表示式。我們需要將它轉換成字尾表示式:
9 3 1 - * 2 +的形式求值。其中需要兩個棧:數字棧和運算子棧。
過程:
逐個讀取中綴表示式(char型):9*(3-1)+2
1.如果是數字則壓入數字棧(如果是大於一位的數字則需要寫個函式轉換成int型)
2.如果是'('則壓入運算子棧中
3.如果是'+'或者'-',判斷一下運算子的棧頂元素,如果是'*','/','+','-'則出棧,調用出棧函式(利用數字棧和運算子棧算出中間結果),然後將該運算子壓入運算子棧中
4.如果是'*'或者'/',判斷一下運算子的棧頂元素,如果是'*'或者'/',則出棧,調用出棧函式,然後將該運算子壓入運算子棧中
5.如果是'(',則直接調用出棧函式,直到將'('出棧為止
6.遍歷完中綴表示式後,如果此時運算子棧不為空,則調用出棧函式逐個出棧
7.最後的結果是數字棧的棧頂元素
程式碼:
/*--------------------------------------------
--利用棧進行四則運算,將中綴表示式轉換成字尾表示式求值--
--------------------------------------------*/
#include<stdio.h>
#include<math.h>
#define MAXSIZE 30
//出棧函式
void pop(int *num,char *c,int *num_p,int *str_p)
{
int num1,num2,result=0;
num1=num[(*num_p)--];
num2=num[(*num_p)--];
if(c[*str_p]=='+') result=num1+num2;
else if(c[*str_p]=='-') result=num2-num1;
else if(c[*str_p]=='*') result=num1*num2;
else if(c[*str_p]=='/') result=num2/num1;
//printf("中間結果:=%d \n",result);
num[++(*num_p)]=result;
(*str_p)--;
}
//字元數組裡的數字轉換成int型
void change(int *num,char *all,int *all_p,int *num_p)
{
int item=*all_p;
int number1=0;
while((all[item]-'0')>=0&&(all[item]-'0')<=9)
{
number1++;
item++;
}
number1--;
int result=0;
while(all[*all_p]-'0'>=0&&all[*all_p]-'0'<=9)
{
result=result+pow(10,number1)*(all[*all_p]-'0');
(*all_p)++;
number1--;
}
(*all_p)--;
//printf("=%d,",*all_p);
num[++(*num_p)]=result;
}
int main(void)
{
//number儲存數字
int number[MAXSIZE];
//all_put儲存標準輸入,str儲存運算子號
char all_put[60],str[MAXSIZE];
//兩個陣列的棧頂指標
int num_top,str_top;
num_top=-1;
str_top=0;
str[0]='(';
char c;
int i=0;
while((c=getchar())!='\n')
all_put[i++]=c;
int j;
for(j=0;j<i;j++)
{
c=all_put[j];
//該字元是數字時
if((c-'0'>=0)&&(c-'0'<=9))
change(number,all_put,&j,&num_top);
//該字元是'('
else if(c=='(')
str[++str_top]=c;
//該字元是'+'或'-'
else if(c=='+'||c=='-')
{
if(str[str_top]=='+'||str[str_top]=='-'||str[str_top]=='*'||str[str_top]=='/')
{
pop(number,str,&num_top,&str_top);
str[++str_top]=c;
}
else
str[++str_top]=c;
}
//該字元是'*'或者'/'
else if(c=='*'||c=='/')
{
if(str[str_top]=='*'||str[str_top]=='/')
{
pop(number,str,&num_top,&str_top);
str[++str_top]=c;
}
else
str[++str_top]=c;
}
//該字元是')'
else if(c==')')
{
pop(number,str,&num_top,&str_top);
str_top--;
}
//printf("字元:%c\n",str[str_top]);
}
while(str_top>0)
pop(number,str,&num_top,&str_top);
printf("運算結果為:%d\n",number[num_top]);
return 0;
}