資料結構之棧(四)

2021-07-10 01:25:52 字數 2103 閱讀 2666

本文將繼續擴充套件stack在arithmetical expression的處理方面的應用,其中包括:「postfix2prefix」、「postfix2infix」和「infix2postfix」。

一、「postfix2prefix

」它是通過多次入棧和出棧來完成的。主要步驟是:遍歷「postfix string」:

1)是運算元先壓棧;

2)是算符就先取出它需要的運算元,調整順序(保證算符在前,運算元在後),並焊接在乙個整體(string),再壓棧。

bool isoperator(char c)

void postfix2prefix(string & postfix, string & prefix)

; if (std::isdigit(postfix[i]))

stack.push(*new string(s));

else if (isoperator(postfix[i]))

}string & arg = dynamic_cast(stack.pop());

prefix = string(arg);

delete & arg;

}

二、「

postfix2infix

」它的原理於上面的相似,只是在調整順序的時候,保證「算符在運算元中間,並新增圓括號」。

void postfix2infix(string & postfix, string & infix)

; if (std::isdigit(postfix[i]))

stack.push(*new string(s));

else if (isoperator(postfix[i]))

}string & arg = dynamic_cast(stack.pop());

infix = string(arg);

delete & arg;

}

注:類似的原理,也可以處理「prefix expression」。

三、「infix2postfix

」它的原理要稍微複雜一些。需要比較運算子的優先順序和考慮運算子的結合性以及圓括號。它也是遍歷「infix string」:

3)遇到左括號壓棧,遇到右括號出棧。(對於括號是成對處理)

int getoperatorweight(char op)

return weight;

}bool isrightassociative(char op)

bool hashigherprecendence(char loperator, char roperator)

return op1weight > op2weight ? true : false;

}void infix2postfix(string & infix, string & postfix)

; if (infix[i] == ' ' || infix[i] == ',') // if character is a delimitter, move on.

continue;

else if (std::isdigit(infix[i]))

postfix += infix[i];

else if (isoperator(infix[i])) // if character is operator

stack.push(*new string(string));

}else if (infix[i] == '(')

));}

else if (infix[i] == ')') // a pair of parenthesis is a processing unit

stack.pop();}}

while (!stack.isempty())

}

注:從該函式對圓括號的成對處理方法,可以擴充套件:在處理c++**時,由於**塊是用花括號包裹,而花括號也是成對出現的,也可以採用棧進行快取處理。或者,更簡單的辦法是「計算」。設定「int count = 0」;遇到左花括號則「++count」;遇到右花括號則「--count」;

資料結構 (四)棧

總體來說,棧的知識比線性表 順序表簡單很多。但是同時也有許多需要注意的點,稍稍不注意就可能會出現錯誤,因此,雖然簡單一點,但也要細心學習。一 基本知識 棧 限定僅在表尾進行插入和刪除操作的線性表。允許插入和刪除的一端稱為棧頂,另一端稱為棧底。空棧 不含任何資料元素的棧。棧的操作特性 後進先出 注意 ...

資料結構 四 棧

棧是限定僅在表尾進行插入和刪除的線性表 typedef struct sqstack 棧的順序基本操作 1 進棧操作 status push sqstack s,selemtype e s top s data s rop e return ok 2 出棧操作 status pop sqstack ...

四 資料結構之棧的單棧儲存結構

由於單棧的 實現比較簡單,所以沒有加注釋,不理解的地方請參照線性表的順序儲存結構的實現 include include define ok 1 define error 0 define maxsize 10 typedef int status typedef int elemtype typed...