N DAG優化 編譯原理

2021-10-11 14:43:11 字數 1494 閱讀 7461

大家都學過了**優化,其中有乙個dag優化,這次我們就練習這個操作。

輸入第一行為乙個整數n(n < 100),表示該組輸入的表示式的個數

之後n行為表示式,每個變數為乙個字母,表示式僅包括二元運算 + - * /

例如:a=b+c

通過構造dag圖,進行**優化,只需要保留ab,刪除無用變數,刪除變數時,盡量保留最早出現的變數。

ps:保證ab的值不同

input 

3

a=b+c

b=b+b

a=c+c

output 

b=b+b

a=c+c

#include using namespace std;

int cnt,n; // cnt 為當前結點的個數,n為輸入的表示式個數

char s[10]; //臨時輸入

char ans[101][101]; // 最後輸出的優化後的表示式

bool flas[101]; //用於記錄那些表示式最後可以輸出

struct stnode[101];

// i 是第i個結點,c是當前查詢的符號

bool find_var(int i, char c)

}return false;

}// 建立結點

// add_node 返回的值時該結點的標號,也就是位置

int add_node(char c)

}// 沒有找到該結點,則需要新建立

node[cnt].id = c;

return cnt ++;

}//新增表示式

void add_operator(char c, char op, int l, int r)

}// 如果沒有,則需要把整個表示式都加進去

// 形狀是結點為操作符,左右結點為運算元,結果存到父節點的var中

node[cnt].id = op;

node[cnt].left = l;

node[cnt].right = r;

node[cnt].var.push_back(c);

cnt ++;

}// 保留變數標記

void dfs(int i)

}// ok函式

char ok(int i)

}// 如果沒有那就暫時儲存這個值

return node[i].var[0];

}int main()

for(int i = 0; i < cnt; i ++)

}// 保留所需要變數

// 題目中要求保留a、b

for(int i = cnt - 1; i >= 0; i --)

}for(int i = cnt - 1; i >= 0; i --)

}for(int i = 0; i < cnt; i ++)

}return 0;

}

3500N DAG優化(編譯原理)

大家都學過了 優化,其中有乙個dag優化,這次我們就練習這個操作。輸入第一行為乙個整數 n 100 表示該組輸入的表示式的個數 之後 行為表示式,每個變數為乙個字母,表示式僅包括二元運算 例如 a b c 通過構造dag圖,進行 優化,只需要保留ab,刪除無用變數,刪除變數時,盡量保留最早出現的變數...

編譯原理第十章 優化

1 區域性優化是在 b 範圍內進行的優化?a 過程體 b 基本塊 c 函式體 d 迴圈體 2 有關基本歸納變數的作用,錯誤的是 d a 自身定值 b 計算其它同族歸納變數 c 控制迴圈 d 記錄迴圈的結果 3 在迴圈內可以實行的優化有 d a 外提 b 刪除歸納變數 c 強度削弱 d 以上都有 4 ...

編譯原理 編譯原理期末複習1

1,關於文法 乙個文法g可以抽象的分為四元組 vn,vt,p,s vn表示非終結符 vt表示終結符 p表示產生式 s表示開始符 2,老師上課說的編譯原理的階段說的是 詞法分析,語法分析,語義分析,中間 生成,優化,目標 生成 其中語法分析,語義分析,中間 生成稱為語法制導翻譯 語義分析,中間 生成稱...