南陽 oj 鬱悶的c小加(三) 題目409

2021-07-04 08:48:21 字數 1679 閱讀 2303

表示式樹思路

(a+b)*(c*(d+e);

對該樹進行後序遍歷得到字尾表示式

ab+cde+**;

這裡實現的是如何根據乙個字尾表示式,構造出其相應的表示式樹。

演算法思想:其實很簡單,主要就是棧的使用。演算法時間複雜度是o(n),n是字尾表示式長度。

從前向後依次掃瞄字尾表示式,如果是運算元就建立乙個單節點樹,並把其指標壓入棧。如果是操作符,則

建立乙個以該操作符為根的樹,然後從棧中依次彈出兩個指標(這2個指標分別指向2個樹),作為該樹的

左右子樹。然後把指向這棵樹的指標壓入棧。直到掃瞄完字尾表示式。

最後棧中就會只有乙個指標。這個指標指向構造的表示式樹的根節點。*/(a+b)*(c*(d+e);

對該樹進行後序遍歷得到字尾表示式

ab+cde+**;

這裡實現的是如何根據乙個字尾表示式,構造出其相應的表示式樹。

演算法思想:其實很簡單,主要就是棧的使用。演算法時間複雜度是o(n),n是字尾表示式長度。

從前向後依次掃瞄字尾表示式,如果是運算元就建立乙個單節點樹,並把其指標壓入棧。如果是操作符,則

建立乙個以該操作符為根的樹,然後從棧中依次彈出兩個指標(這2個指標分別指向2個樹),作為該樹的

左右子樹。然後把指向這棵樹的指標壓入棧。直到掃瞄完字尾表示式。

最後棧中就會只有乙個指標。這個指標指向構造的表示式樹的根節點。

#include

#include

#include

#include

#include

#define n 1000

using namespace std; 

char str[n],s[2*n];

typedef struct node//二叉樹,節點型別

*linklist;

stackch;//儲存節點

stackca;//儲存運算子

stacknum;

int top;

int com(char x)

}void zhuan()

else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')

ca.push(str[i]);}}

else if(str[i]=='(') ca.push(str[i]);

else if(str[i]==')')

ca.pop();}}

while(ca.top()!='#')

}  linklist cre()//根據字尾式建立二叉樹

else if(s[i]>='0'&&s[i]<='9')

b[j]='\0';

strcpy(tree->x,b);

ch.push(tree);}}

return ch.top();

}void xtree(linklist head)//字首式輸出 }

void xiao(linklist head)

}void ji()

s3[k]='\0';

num.push(atof(s3));

}else}}

printf("%.2lf\n",num.top());

}int main()

printf(" =\n");

ji();

}return 0;

}

鬱悶的C小加(三) 幾許情愁

聰明的你幫助 c小加解決了中綴表示式到字尾表示式的轉換 詳情請參考 鬱悶的c小加 一 c小加很高興。但 c小加是個愛思考的人,他又想通過這種方法計算乙個表示式的值。即先把表示式轉換為字首和字尾表示式,再求值。這時又要考慮運算元是小數和多位數的情況。第一行輸入乙個整數t,共有t組測試資料 t 10 每...

鬱悶的C小加(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...

鬱悶的C小加(一)

我們熟悉的表示式如 a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2 同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 operand acm 隊的 c 小加 正在鬱悶怎樣把乙個中綴表示式轉換為字...