大家都學過了**優化,其中有乙個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,老師上課說的編譯原理的階段說的是 詞法分析,語法分析,語義分析,中間 生成,優化,目標 生成 其中語法分析,語義分析,中間 生成稱為語法制導翻譯 語義分析,中間 生成稱...