C++ 三元表示式求值程式


假設我們有一個包含三元表示式的表示式,我們需要計算表示式的結果。它支援一些值,例如 T 和 F 代表 True 和 False,以及“?”和“:”字元。有一些屬性:

  • 給定字串的長度必須小於或等於 10000。
  • 條件表示式從右到左分組。
  • 條件始終為 T 或 F。因此,條件永遠不會是數字。
  • 表示式的結果將始終計算為 T 或 F。

例如,如果輸入類似於“T ? T ? F : T : T”,則輸出將為 F。

為了解決這個問題,我們將遵循以下步驟:

  • ret := 一個空字串,n := s 的大小,
  • 建立一個棧 st
  • 對於 i in range n – 1 到 0
    • x := s[i]
    • 如果 st 不為空且棧頂為“?”,則
      • 從 st 中刪除
      • first := st 的棧頂,然後從棧中刪除兩個元素
      • second := 棧頂,並從 st 中刪除
      • 如果 x 為 T,則將 first 插入 st,否則將 second 插入 st
    • 否則將 x 插入 st
  • 當 st 不為空時,則
    • ret := ret + st 的棧頂,並從 st 中刪除
  • 反轉 ret 並返回 ret

讓我們看下面的實現來更好地理解

示例

線上演示

#include
using namespace std;
class Solution {
   public:
   string parseTernary(string s) {
      string ret = "";
      int n = s.size();
      stack st;
      for(int i = n - 1; i >= 0; i--){
         char x = s[i];
         if(!st.empty() && st.top() == '?'){
            st.pop();
            char first = st.top();
            st.pop();
            st.pop();
            char second = st.top();
            st.pop();
            if(x == 'T'){
               st.push(first);
            }
            else st.push(second);
         }
         else{
            st.push(x);
         }
      }
      while(!st.empty()){
         ret += st.top();
         st.pop();
      }
      reverse(ret.begin(), ret.end());
   return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.parseTernary("T?T?F:T:T"));
}

輸入

" T?T?F:T:T"

輸出

F

更新於:2020年11月26日

246 次檢視

啟動您的職業生涯

完成課程後獲得認證

開始學習
廣告
© . All rights reserved.