表示式樹思路
(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 小加 正在鬱悶怎樣把乙個中綴表示式轉換為字...