算法的用途:

我的目的很簡單,做一個24點牌的Flash小游戲,接受用戶輸入的表達式,然后計算結果。貌似在AS中沒有可以直接計算字符串表達式的函數,所以只好自己寫了。要計算這個表達式(帶括號)首先得把括號去掉,括號真的是挺麻煩的一個東東,所以還得選后綴表達式-_-

算法基本思想:

使用三個數組,一個數組保存用戶輸入的表達式(中綴表達式),一個數組保存后綴表達式,一個數組作為運算符的棧。

從頭到尾掃描中綴表達式,對不同類型的字符按不同情況處理;
1、如果是數字則直接放入后綴表達式數組;
2、如果是左括號則直接入棧;
3、如果是右括號,則把從棧頂直到對應左括號之間的運算符依次退棧,并清除對應的左括號;
4、對于運算符,如果該運算符的優先級大于棧頂優先級,則直接入棧,若該運算符的優先級小于等于棧頂優先級,則先把棧頂運算符出棧,寫入后綴表達式數組,然后再入棧;
5、掃描完成后,取出棧中所有運算符,寫入后綴表達式數組。

示例程序如下(面向過程的C(++)版,在VC6下編譯通過):
引用內容:
/****************************/
/*????????www.afdream.com????????*/
/*?????????Author:Fdream????????*/
/*????引用此算法請保留此信息????*/
/****************************/

#include<iostream.h>

const?int?MAX=40;

void?main(void){
????char?infix[MAX]={'#'};
????char?oprator[MAX]={'@','#'};
????int?opr=1;
????char?postfix[12]={'#'};
????int?post=0;
????int?i,j,cnt=0,cntl;
????char?c;

????//輸入表達式,以等號結束
????cin.get(c);
????while(c!='='){
????????infix[cnt]=c;
????????cnt++;
????????cin.get(c);
????}
????cntl=cnt;

????for(i=0;i<cnt;i++){
????????switch(infix[i]){
????????//左括號就直接入棧
????????case?'(':
????????????cntl=cntl-2;
????????????oprator[opr]=infix[i];
????????????opr++;
????????????break;
????????//右括號則先退棧,直到遇見第一個左括號
????????case?')':
????????????for(j=opr-1;j>0;j--){
????????????????if(oprator[j]!='('){
????????????????????postfix[post]=oprator[j];
????????????????????oprator[j]='#';
????????????????????post++;
????????????????}
????????????????else{
????????????????????oprator[j]?=?'#';
????????????????????break;
????????????????}
????????????}
????????????opr=j;
????????????break;
????????case?'*':
????????case?'/':
????????????//如果前一個運算符為*或/,則先退棧,再入棧,否則直接入棧
????????????if?(oprator[opr]?==?'*'?||?oprator[opr]?==?'/')?{
????????????????postfix[post]?=?oprator[opr];
????????????????oprator[opr]='#';
????????????????post++;
????????????}
????????????oprator[opr]?=?infix[i];
????????????opr++;
????????????break;
????????case?'+'?:
????????case?'-'?:
????????????//如果上一個運算符不是左括號也不是棧頂,則先退棧再入棧
????????????if?(oprator[opr-1]?!=?'('?&&?oprator[opr-1]?!=?'@')?{????????????
????????????????postfix[post]?=?oprator[opr];
????????????????oprator[opr]='#';
????????????}
????????????oprator[opr]?=?infix[i];
????????????opr++;
????????????break;
????????default?:
????????????//如果是數字則直接進入后綴表達式數組
????????????postfix[post]?=?infix[i];
????????????post++;
????????????break;
????????}
????}

????//如果掃描完成,則退棧
????for(j=opr-1;j>0;j--){
????????if(oprator[j]!='@'){
????????????postfix[post]=oprator[j];
????????????oprator[j]='#';
????????}
????????else
????????????break;
????}

????//輸出結果
????for(i=0;i<cntl;i++)
????????cout?<<?postfix[i];
????cout?<<?endl;
}