算法的用途:

我的目的很簡(jiǎn)單,做一個(gè)24點(diǎn)牌的Flash小游戲,接受用戶(hù)輸入的表達(dá)式,然后計(jì)算結(jié)果。貌似在AS中沒(méi)有可以直接計(jì)算字符串表達(dá)式的函數(shù),所以只好自己寫(xiě)了。要計(jì)算這個(gè)表達(dá)式(帶括號(hào))首先得把括號(hào)去掉,括號(hào)真的是挺麻煩的一個(gè)東東,所以還得選后綴表達(dá)式-_-

算法基本思想:

使用三個(gè)數(shù)組,一個(gè)數(shù)組保存用戶(hù)輸入的表達(dá)式(中綴表達(dá)式),一個(gè)數(shù)組保存后綴表達(dá)式,一個(gè)數(shù)組作為運(yùn)算符的棧。

從頭到尾掃描中綴表達(dá)式,對(duì)不同類(lèi)型的字符按不同情況處理;
1、如果是數(shù)字則直接放入后綴表達(dá)式數(shù)組;
2、如果是左括號(hào)則直接入棧;
3、如果是右括號(hào),則把從棧頂直到對(duì)應(yīng)左括號(hào)之間的運(yùn)算符依次退棧,并清除對(duì)應(yīng)的左括號(hào);
4、對(duì)于運(yùn)算符,如果該運(yùn)算符的優(yōu)先級(jí)大于棧頂優(yōu)先級(jí),則直接入棧,若該運(yùn)算符的優(yōu)先級(jí)小于等于棧頂優(yōu)先級(jí),則先把棧頂運(yùn)算符出棧,寫(xiě)入后綴表達(dá)式數(shù)組,然后再入棧;
5、掃描完成后,取出棧中所有運(yùn)算符,寫(xiě)入后綴表達(dá)式數(shù)組。

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

#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;

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

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

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

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