qt中綴轉字尾演算法(用棧)(新手 歡迎指點錯誤)
阿新 • • 發佈:2019-02-03
中綴就是我們常見的一些的數學式子,比如:3+4,(3+4)*4+1,等。
而後綴是計算機計算比較好用的一個方式。比如:34+,
qt我們可以先建立一個專案。
首先我們要建棧,棧是比較好建的。
#define max 100
typedefchardata;
typedefstruct{
//intmax=10;
chara[10];//你可自己定義大小,這裡方便處理,定義10。
inttop;
}slist_stack;
建完棧然後要處理棧,
更新:
slist_stack *l;//後面都用l;
l->top=0;
刪除://棧是先進後出行,操作都在棧頂,也就是top;
if(l->top==0)
{
qDebug()<<"無資料!";
return-1;
}
else
{
l->top-=1;
return1;
}增添:
if(l->top==10)//剛剛定義了資料大小為10;
{
qDebug()<<"棧已滿!";
return-1;
}
else
{
l->a[l->top]=data;//data你要插入的資料;
l->top++;
return1;
}做完這些,我們可以去寫轉化的函式
轉化的要求:(我自己總結的話語,有點毛糙,但容易理解)注:這裡沒有考慮小數,小數的話就是小數點後面數除以10,100,1000等等。
//1:如果是(則直接進棧,若為數字直接輸出,
//2:如果是+-*/,則判定棧定的元素優先順序是否比現在的符號優先順序高,若低,棧輸出,低的進棧。否則進棧
//3:如果是),是棧中的(之前的所有的符號出棧;
reset(l);//重置棧就是更新,我把它寫到函式裡了
intj=0,i=0;
charf[20];//存放字尾表示式的陣列(大小可以定以)
while(c[i]!='#')//c[]陣列存放的是中綴表示式,以#結尾。(當然也可以不用,可以用陣列的大小)
{
if(c[i]=='(')//符號進棧
{
l->a[l->top]=c[i];//進棧的操作
l->top++;
qDebug()<<"棧的符號數為:"<<l->top;//來除錯棧的符號數
}
elseif(c[i]>=48&&c[i]<=57)//0到9的的ascii碼,數字輸出
{
f[j++]=c[i];//數字輸出到數組裡
}
elseif(c[i]=='+'||c[i]=='-')//+,-,優先順序低於*,/
{
if(l->a[l->top-1]=='('||l->a[l->top-1]=='+'||l->a[l->top-1]=='-')//若棧頂的符號優先順序不高等進棧
{
l->a[l->top]=c[i];
l->top++;
qDebug()<<"棧的符號數為:"<<l->top;
}
else//否則則輸出棧頂的元素,且出棧,然後把從c[i](低階的符號)進棧
{
f[j++]=l->a[l->top-1];
l->top=l->top-1;
l->a[l->top]=c[i];
l->top++;
qDebug()<<"棧的符號數為:"<<l->top;
}
}
elseif(c[i]=='*'||c[i]=='/')//直接進棧,因為你其優先順序最高
{
l->a[l->top]=c[i];
l->top++;
qDebug()<<"棧的符號數為:"<<l->top;
}
elseif(c[i]==')')//碰到右括號時,吧棧左括號前面的全部輸出
{
while(l->a[l->top-1]!='(')
{
f[j++]=l->a[l->top-1];
l->top=l->top-1;
}
l->top=l->top-1;
qDebug()<<"棧的符號數為:"<<l->top;
}
i++;
}
while(l->top!=0)//判定棧是否為空,不為則直接輸出.
{
f[j++]=l->a[l->top-1];
del(l);
}
QStringa;
for(inti1=0;i1<j;i1++)//這個可有可無 我是用來檢視的,可能多此一舉了
{
a+=f[i1];
}
f[j++]='#';
qDebug()<<a;
//轉化完成了