LR 用棧實現移進 歸約分析 demo

2022-07-22 06:12:16 字數 1488 閱讀 2476

1.考慮文法

\(e->e+e\)

\(e->e*e\)

\(e->id\)

2.最右推導

不難看出,這個文法是而二義的,所以有多個最右推導

3.移進歸約

用乙個棧存文法符號,用輸入快取區儲存要分析的輸入串,用$標記棧底

#include#include#include#include#includeusing namespace std;

stackstk, tmp;

string w;

bool flag = false;

int main(void)

else

stk.push(tt); //將符號壓入棧

w = w.substr(now, w.size() - now); //丟棄已掃瞄的字元

continue;

} while (!stk.empty())

while (!tmp.empty())

if (stk.top() == "id")

if (w[now]=='$'&&stk.size() == 2 && stk.top() == "e")

if (w[now]!='$')

else

cout.width(11 - stk.size());

cout << "|";

cout.setf(ios::right); //設定字元對其方式

cout.width(10); //設定字元寬度

cout << w;

cout<< "|移進" << endl;

printf("----------|----------|----------\n");

stk.push(tp);

w = w.substr(now, w.size() - now); //丟棄已掃瞄的字元

continue;

} if (w[now] == '$' &&!flag) { //e-->e+e或者e-->e*e歸約

string tc;

tc = stk.top();

if (tc == "e")

stk.pop();

tc += stk.top();

if (stk.top() != "e") {

stk.pop();

tc += stk.top();

cout.setf(ios::right); //設定字元對其方式

cout.width(9- stk.size());//設定字元寬度

cout << "|";

cout << " $|";

cout << "按e-->"<4.sample

輸入id*id+id

用棧實現佇列的進隊出隊操作

假設有兩個棧stack1,stack2 用這兩個棧來實現佇列的push 和 pop 操作 思路 進隊 push 操作,直接使用stack1.push 將元素進棧即可 出隊 pop 操作,先判斷stack2是否為空。若不為空,則stack2直接出棧即可 若為空,則將stack1中的元素全部出棧,並依次...

用棧實現佇列 用佇列實現棧

棧的特點 filo firstinlastout 僅能從棧頂插入,刪除元素。最基本的介面包括push 從棧頂壓入元素 pop 從棧頂彈出元素 佇列的特點 fifo firstinfirstout 僅能從隊頭刪除元素,從隊尾插入元素。最基本的介面包括enque 從隊尾插入元素 deque 從隊頭刪除元...

用棧實現佇列,用佇列實現棧。好玩!!!

因為在資料結構中,棧和佇列長得實在是太像了,將他們拿來比較是不可避免的,棧 後進先出,而佇列 先進先出。同樣是只能在一端進行操作,那麼問題來了,能相互實現?能不能得好好分析一下嘛,如果是用兩個棧來實現佇列,好像這操作可以哦。一下,你就明白!顯然用兩個棧可以實現佇列的功能,就是借助另乙個棧來中轉一下,...