栈(2)
棧的鏈接存儲結構及實現
鏈棧:棧的鏈接存儲結構
鏈棧的類聲明:
template
class LinkStack
{
public:
LinkStack( ) {top=NULL;};
~LinkStack( );
void Push(T x);
T Pop( );
T GetTop( );
bool Empty( );
private:
Node *top;
}
鏈棧的實現——插入(入棧)
操作接口:(void Push(T x));
算法描述:
template
void LinkStack::Push(T x)
{
s=new Node;
s->data=x;
s->next=top;
top=s;
}
鏈棧的實現——刪除(出棧)
操作接口: T Pop( );
算法描述:
template
T LinkStack::Pop( )
{
if (top==NULL)
throw “下溢”;
x=top->data;
p=top;
top=top->next;
delete p;
return x;
}
鏈棧的實現——鏈棧的析構(鏈棧的銷毀)
template
LinkStack::~LinkStack( )
{
while (top)
{
Node *p;
p=top->next;
delete top;
top=p;
}
}
順序棧和鏈棧的比較
時間性能:相同,都是常數時間O(1)。
空間性能:
順序棧:有元素個數的限制和空間浪費的問題。
鏈棧:沒有棧滿的問題,只有當內存沒有可用空間時才會出現棧滿,但是每個元素都需要一個指針域,從而產生了結構性開銷。
結論:當棧的使用過程中元素個數變化較大時,用鏈棧是適宜的,反之,應該采用順序棧。
后綴表達式求值算法
從左到右對后綴表達式字符串進行處理,每次處理一個符號
若遇到數字,入棧
若遇到運算符,棧頂兩個數字出棧,執行運算符所定義的運算,并將運算結果入棧
重復以上的工作,直到表達式結束,此時,棧中的數字代表最終的值。
中綴表達式求值
表達式的組成:
操作數(operand):
操作數既可以是常數, 也可以是被說明為變量或常量;
運算符(operator):
運算符可以分為算術運算符、 關系運算符和邏輯運算符三類,不同的運算符有不同的優先級以及結合性
界限符(delimiter) :
基本界限符有左右括號和表達式結束符等。 例如:
#(3+4)*5-2#,界限符的優先級相同(左括號和右括號的優先級相同,#的優先級也相同)
中綴表達式求值過程
設置兩個棧:
??????? OVS(運算數棧)和OPTR(運算符棧)。
(2) 自左向右掃描中綴表達式,
遇操作數進OVS,
遇操作符則與OPTR棧頂優先數比較:
OPTR棧頂<當前操作符, 當前操作符進OPTR棧
OPTR棧頂>=當前操作符,OVS棧頂、次頂和OPTR棧頂,退棧形成運算T(i),T(i)進OVS棧。
中綴表達式轉化為后綴表達式
設置一個運算符棧。從左到右依次對中綴表達式中的每個符號進行處理
如果遇到數字,直接輸出
如果遇到“(”,則將其入棧
如果遇到運算符a,如果棧頂符號的優先級低于a的優先級,則入棧;否則,棧頂符號出棧,直到棧頂符號的優先級低于a的優先級,此時讓a入棧
若遇到“)”,則棧頂符號出棧,直到“(”
重復以上工作,直到表達式結束,此時,將棧里符號全部出棧。
總結
- 上一篇: 分布式认知工业互联网如何赋能工业企业数字
- 下一篇: 从键盘输入一个字符,如果是小写字母,则将