Java?C++刷題leetcode1106解析布爾表達(dá)式
更新時(shí)間:2023年01月16日 14:17:45 作者:AnjaVon
這篇文章主要為大家介紹了Java?C++刷題leetcode1106解析布爾表達(dá)式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
題目
思路:?!居?jì)算器】
- 和計(jì)算器原理類似,分別用兩個(gè)棧存操作數(shù)和操作符,然后到
)
就開始運(yùn)算前面的內(nèi)容,括號(hào)里運(yùn)算都相同所以還是比較簡單的。 - 要注意字母t、f和布爾值
true
、false
的轉(zhuǎn)換。
Java
class Solution { public boolean parseBoolExpr(String expression) { Deque<Character> tfs = new ArrayDeque<>(), opts = new ArrayDeque<>(); for (char c : expression.toCharArray()) { if (c == ',') continue; else if (c == 't' || c == 'f' || c == '(') tfs.addLast(c); else if (c == '|' || c == '&' || c == '!') opts.addLast(c); else if (c == ')') { char op = opts.pollLast(), cur = ' '; while (!tfs.isEmpty() && tfs.peekLast() != '(') { char top = tfs.pollLast(); cur = cur == ' ' ? top : calBool(top, cur, op); } if (op == '!') cur = cur == 't' ? 'f' : 't'; tfs.pollLast(); tfs.addLast(cur); } } return tfs.peekLast() == 't'; } char calBool(char cx, char cy, char op) { boolean bx = cx == 't', by = cy == 't'; boolean res = op == '|' ? bx | by : bx & by; return res ? 't' : 'f'; } }
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n)
C++
class Solution { public: bool parseBoolExpr(string expression) { stack<char> tfs, opts; for (auto c : expression) { if (c == ',') continue; else if (c == 't' || c == 'f' || c == '(') tfs.push(c); else if (c == '|' || c == '&' || c == '!') opts.push(c); else if (c == ')') { char op = opts.top(), cur = ' '; opts.pop(); while (!tfs.empty() && tfs.top() != '(') { char top = tfs.top(); tfs.pop(); cur = cur == ' ' ? top : calBool(top, cur, op); } if (op == '!') cur = cur == 't' ? 'f' : 't'; tfs.pop(); tfs.push(cur); } } return tfs.top() == 't'; } char calBool(char cx, char cy, char op) { bool bx = cx == 't', by = cy == 't'; bool res = op == '|' ? bx | by : bx & by; return res ? 't' : 'f'; } };
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n)
Rust
impl Solution { pub fn parse_bool_expr(expression: String) -> bool { let (mut tfs, mut opts) = (vec![], vec![]); for c in expression.chars() { if c == 't' || c == 'f' || c == '(' { tfs.push(c); } else if c == '|' || c == '&' || c == '!' { opts.push(c); } else if c == ')' { let op = opts.pop().unwrap(); let mut cur = 'e'; while !tfs.is_empty() && tfs[tfs.len() - 1] != '(' { let top = tfs.pop().unwrap(); if cur == 'e' { cur = top; } else { // fn calBool() let (bx, by, mut tmp) = (top == 't', cur == 't', false); if op == '|' { tmp = bx | by; } else { tmp = bx & by; } if tmp { cur = 't'; } else { cur = 'f'; } } } if op == '!' { // 非 if cur == 't' { cur = 'f'; } else { cur = 't'; } } tfs.pop(); tfs.push(cur); } } tfs.pop().unwrap() == 't' } }
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n)
總結(jié)
- 像是數(shù)據(jù)結(jié)構(gòu)里學(xué)棧時(shí)舉的計(jì)算器的例子,就循著這個(gè)思路感覺不算困難題。
- 當(dāng)然也可以遞歸或者只用一個(gè)棧,整體思路其實(shí)就是巧妙一點(diǎn)的模擬。
以上就是Java C++刷題leetcode1106解析布爾表達(dá)式的詳細(xì)內(nèi)容,更多關(guān)于Java C++解析布爾表達(dá)式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
spring boot 利用注解實(shí)現(xiàn)權(quán)限驗(yàn)證的實(shí)現(xiàn)代碼
這篇文章主要介紹了spring boot 利用注解實(shí)現(xiàn)權(quán)限驗(yàn)證的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11RocketMQ生產(chǎn)消息與消費(fèi)消息超詳細(xì)講解
這篇文章主要介紹了RocketMQ生產(chǎn)消息與消費(fèi)消息,RocketMQ可用于以三種方式發(fā)送消息:可靠的同步、可靠的異步和單向傳輸。前兩種消息類型是可靠的,因?yàn)闊o論它們是否成功發(fā)送都有響應(yīng)2022-12-12CompletableFuture并行處理List分批數(shù)據(jù)demo
這篇文章主要介紹了CompletableFuture并行處理List分批數(shù)據(jù)實(shí)現(xiàn)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問題解決
這篇文章主要介紹了Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04