資源簡介
使用棧將中綴表達式轉化為后綴表達式然后求值
語言C++

代碼片段和文件信息
#include?
#include?
#include?
//*******************************************************************************************************
class?Stack{ //棧類定義
private:
double?A[300];
public:
void?InitStack() //初始化
{ A[0]?=?0;}
void?Push(double?key)???//入棧
{
if(A[0]<=?300?-?1)
{
int?i?=?(int)++A[0];
A[i]?=?key;
}
else
printf(“棧已滿!!\n“);
}
double?Pop() //出棧
{
if(A[0]?!=?0)
{
int?i?=?(int)A[0];
A[0]--;
return?A[i];
}
printf(“棧已空!!\n“);
return?-1;
}
bool?IsOneLeft()
{
if((int)A[0]?==?1)
return?1;
return?0;
}
};
//**********************************************************************************************************************
char*?SExp(char?s[]) //求后綴表達式
{
int?iabc=0;
char?A[300]B[300];
i?=?0;
a?=?0;
while(s[i]?!=?‘\0‘) //首次遍歷,檢查是否有輸入錯誤以及整理表達式
{
if(s[i]?<=?‘9‘?&&?s[i]?>=‘0‘) A[a++]?=?s[i]; //數字
else?if(s[i]?==?‘-‘) //減法
{
if(i==0||s[i-1]==‘(‘)
{
A[a++]?=?‘~‘;
}
else?if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i+1]!=‘)‘)
A[a++]?=?s[i];
else c=1;
}
else?if(s[i]?==?‘+‘) //加法
{
if(i==0||s[i-1]==‘(‘)
{}
else?if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i+1]!=‘)‘)
A[a++]?=?s[i];
else c=1;
}
else?if(s[i]==‘*‘) //乘法
{
if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i-1]!=‘(‘&&s[i+1]!=‘)‘&&i!=0) A[a++]?=?s[i];
else c=1;
}
else?if(s[i]==‘/‘) //除法
{
if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i-1]!=‘(‘&&s[i+1]!=‘)‘&&i!=0) A[a++]?=?s[i];
else c=1;
}
else?if(s[i]==‘^‘) //指數運算
{
if(s[i+1]!=‘+‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘-‘&&s[i-1]!=‘(‘&&s[i+1]!=‘)‘&&i!=0) A[a++]?=?s[i];
else c=1;
}
else?if(s[i]==‘)‘&&s[i-1]!=‘+‘&&s[i-1]!=‘^‘&&s[i-1]!=‘/‘&&s[i-1]!=‘*‘&&s[i-1]!=‘-‘&&s[i+1]!=‘(‘&&s[i-1]!=‘(‘&&i!=0) A[a++]?=?s[i]; //后括號處理
else?if(s[i]==‘(‘&&s[i+1]!=‘^‘&&s[i+1]!=‘/‘&&s[i+1]!=‘*‘&&s[i+1]!=‘)‘&&s[i-1]!=‘)‘) A[a++]?=?s[i]; //前括號處理
else
c=1;
i++;
if(c) //箭頭報錯設置
{
putchar(24);
printf(“\n箭頭處表達式有誤!\n“);
return?NULL;
}
putchar(‘?‘);
}
A[a]=‘\0‘;
strcpy(sA);
//printf(“\n%s“s);
i=0;
a=0;
b=0;
while(s[i]?!=?‘\0‘) //求后綴表達式
{
if(s[i]?<=?‘9‘?&&?s[i]?>=‘0‘||s[i]==‘~‘)
{
A[a++]=s[i++];
while(s[i]?<=?‘9‘?&&?s[i]?>=‘0‘&&s[i]?!=?‘\0‘)
{
A[a++]=s[i++];
}
A[a++]=‘?‘;
continue;
}
else?if(s[i]==‘+‘)
{
if(b==0||B[b-1]==‘(‘) B[b++]=‘+‘;
else
{
A[a++]=B[--b];
A[a++]=‘?‘;
B[b++]=‘+‘;
}
}
else?if(s[i]==‘-‘)
{
if(b==0||B[b-1]==‘(‘) B[b++]=‘-‘;
else
{
A[a++]=B[--b];
A[a++]=‘?‘;
B[b++]=‘-‘;
}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????33792??2010-11-12?13:17??中綴表達式求值\Debug\vc60.idb
?????文件??????53248??2010-11-12?13:17??中綴表達式求值\Debug\vc60.pdb
?????文件?????217144??2010-11-12?13:17??中綴表達式求值\Debug\zxbdsqz.exe
?????文件?????228520??2010-11-12?13:17??中綴表達式求值\Debug\zxbdsqz.ilk
?????文件??????13226??2010-11-12?13:17??中綴表達式求值\Debug\zxbdsqz.obj
?????文件?????217588??2010-11-11?18:29??中綴表達式求值\Debug\zxbdsqz.pch
?????文件?????484352??2010-11-12?13:17??中綴表達式求值\Debug\zxbdsqz.pdb
?????文件???????5257??2010-11-12?13:17??中綴表達式求值\zxbdsqz.cpp
?????文件???????3413??2010-11-11?18:27??中綴表達式求值\zxbdsqz.dsp
?????文件????????522??2010-11-11?18:29??中綴表達式求值\zxbdsqz.dsw
?????文件??????41984??2010-11-12?13:23??中綴表達式求值\zxbdsqz.ncb
?????文件??????48640??2010-11-12?13:23??中綴表達式求值\zxbdsqz.opt
?????文件???????1433??2010-11-12?13:17??中綴表達式求值\zxbdsqz.plg
?????目錄??????????0??2010-11-12?13:17??中綴表達式求值\Debug
?????目錄??????????0??2010-11-12?13:23??中綴表達式求值
-----------?---------??----------?-----??----
??????????????1349119????????????????????15
評論
共有 條評論