帶括號的表示式計算:通過棧的應用來實現,建立運算元棧和運算子棧,運算子有優先順序。
規則:1.自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。
2.當遇到運算子時如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂
的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。
3.遇到左括號一律進運算子棧,右括號一律不進運算子棧。在遇到對應的右括號前,括號內運算按規則2進行,
當遇到右括號時,將括號內運算結果進運算元棧,並取出左括號。
calculate.c
#include#include#define max_size 100
enum usu
;int calculate(int num1,int num2,char c)
case '-':
case '*':
case '/':
}}int priority(char c)//計算運算子的優先順序
case '*':
case '/':
default:
}return 0;
}void initialize_stack(int *stack,int *top)//初始化順序棧
*top = -1;
}void initialize_stack2(char *stack,int *top)
*top = -1;
}int is_stack_full(int *top)//檢查棧是不是滿
return stack_ok;
}int is_stack_empty(int *top)//檢查棧是不是空
return stack_ok;
}int push_stack(int *stack,int *num,int *top)//入棧
(*top) ++;
stack[*top] = *num;
return push_success;
}int push_stack2(char *stack,char *c,int *top)
(*top) ++;
stack[*top] = *c;
return push_success;
}int pop_stack(int *stack,int *top)//出棧
num = stack[*top];
(*top) --;
return num;
}char pop_stack2(char *stack,int *top)
c = stack[*top];
(*top) --;
return c;
}#if 0
比較解析的運算子+-*/()與棧頂運算子的優先順序,按照規則進行各種出入棧運算
#endif
int compare_priority(char *str,char *stack2,int *top2,int *stack1,int *top1)
if(is_stack_full(top2) == stack_full)
else if(is_stack_empty(top2) == stack_empty||*str == '(')
else if(*str == ')')
//出while迴圈即'('運算子已取出
} else//解析出的運算子為+-*/時執行以下操作
num = priority(c);
num1 = priority(*str);
if(num1 > num)//解析出的運算子優先順序大於棧頂元素優先順序時,解析出的運算子要入棧
else
}return success;
}int main()
//while迴圈結束,str指向運算子或指向字串末尾
*temp = '\0';
temp = dest;
num = atoi(dest);//字串轉整型
push_stack(stack1,&num,&top1);
} //比較解析的運算子+-*/()與棧頂運算子的優先順序,按照規則進行各種出入棧運算
compare_priority(str,stack2,&top2,stack1,&top1);
if(*str == '\0')
str ++; }
/*依次取出運算元棧頂兩元素與運算子棧頂一元素進行計算,結果儲存在運算元棧,直至運算子棧為空
*/ while(top2 != -1)
printf("%s=%d\n",ptr,total);
return 0;
}
編譯執行結果如下:
[root@localhost calculate]# gcc calculate2.c &&./a.out
please input the formula:
3+4-(2*5)+19
3+4-(2*5)+19=16
[root@localhost calculate]# gcc calculate2.c &&./a.out
please input the formula:
3-(4+(5*2))+21
3-(4+(5*2))+21=10
本文**:
棧實現的帶括號的計算器
帶括號的表示式計算 通過棧的應用來實現,建立運算元棧和運算子棧,運算子有優先順序。規則 1.自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。2.當遇到運算子時如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂 的連續兩個運算元進行運算,並將結果存入運算元棧,然...
C語言實現帶括號的計算器
中綴表示式轉字尾表示式的應用 我的演算法以及思路 首先將輸入的東西作為字串存入到乙個字串陣列,然後將中綴表示式轉化為字尾表示式 其中關鍵在於運算子的轉化,比較棧頂元素和當前運算子的優先順序,如果棧頂元素的優先順序大,則壓入棧中,否則把棧裡的運算子彈出直到為空,並且加入到字尾表示式的字串中,再壓棧,最...
九度1019簡單計算器到帶括號的計算器
在王道論壇 計算機考研 機試指南 中例題3.2用比較繁瑣的方法實現了簡單計算器,他的優點在於可以進行擴充套件,本人想實現乙個帶括號的計算器,其他要求和九度1019的題目一致。在原本基礎上的改進 引入左右括號的優先順序,左括號優先順序高於乘除法,右括號的優先順序低於加減法,高於人為定義的標記運算子 左...