棧及波蘭表示式

2021-10-01 15:45:50 字數 1883 閱讀 7443

先進後出

stack.pop():彈出最上層的資料,並彈出資料

stack.push():在棧的最上層壓入資料

stack.peek():檢視棧的最上層資料,但是不彈出資料

表示式分字首表示式、中綴表示式和字尾表示式。

中綴表示式:人類最熟悉的一種表示式1+2,(1+2)3,3+42+4等等都是中綴表示法。

字首表示式又叫做波蘭式,字首表示式為- + a * b - c d * e f

字尾表示式又叫做逆波蘭式。形如:a b c d - * + e f * -

中綴表示式對於計算機的運算並不便利,而字首字尾表示式的計算相對簡單方便。因此,需要將中綴表示式轉換成字首字尾表示式,然後利用棧結構計算前字尾表示式。

棧結構計算字尾表示式

public static void main(string args) 

//計算得到表示式結果

public string caculate(string arrays)elseelse if("-".equals(str))else if("*".equals(str))else if("/".equals(str))else}}

return stack.pop();

}//表示式根據空格分隔得到陣列和操作符的陣列

public string getarray(string expression)

return null;

}

1、轉化原理:

2、轉化示例:

3、轉化**:

public class polandnotationchange 

//2、中綴轉字尾

private string changeexpression(string middlearray) else if("+".equals(str) || "-".equals(str) || "*".equals(str) || "/".equals(str))else if("(".equals(str))else if(")".equals(str))

}while(true)

resultstack.push(operstack.pop());

}stringbuilder sb = new stringbuilder();

while(true)

}return sb.tostring();

}//5、壓棧時右括號處理

public void pushrightstack(stackresultstack,stackoperstack)else

}//4、壓棧時運算子處理

public void pushoperstack(stackresultstack,stackoperstack,string oper)elseelse if(priority(oper) > priority(topoper))else

}}//3、獲取運算子優先順序

public int priority(string oper)else if("-".equals(oper))else if("*".equals(oper))else if("/".equals(oper))

throw new runtimeexception("運算子不正確");

}//1、表示式根據空格分隔得到陣列和操作符的陣列

public string getarray(string expression)

return null;

}

波蘭表示式和逆波蘭表示式(棧)

中綴表示式如1 2 2 1 其運算子一般出現在運算元之間,因此稱為中綴表示式,也就是大家程式設計中寫的表達 式。編譯系統不考慮表示式的優先級別,只是對表示式從左到右進行掃瞄,當遇到運算子時,就把其前面的兩 個運算元取出,進行操作。為達到上述目的,就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示...

波蘭表示式 逆波蘭表示式

中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...

棧和逆波蘭表示式

1 2,1 3 2,1 3 2 1 3 這些就是中綴表示式,就是我們 平時經常見到的形式,先算加減再算乘除,有括號的先算括號裡面的,沒有括號按照優先順序順序進行計算。但是,計算機處理中綴表示式卻並不方便,因為沒有一種簡單的資料結構可以方便從乙個表示式中間抽出,一部分算完結果,再放進去,然後繼續後面的...