乙個算術表示式的計算語義可以用二叉樹唯一的表示出來。假設算術表示式的語義二叉樹已經給出,請編碼實現算術表示式的中綴形式(保持計算語義)的輸出,並計算出該表示式的值。要求:
1)使用二叉樹的完全前序序列建立表示式的語義二叉樹,空子樹用符號@表示;
2)算術運算子包括:
+, -, *, /
*2@@-3@@1@@
樣例輸出:
2*(3-1)=4
這個題被我搞出來個hack資料,是這個:
輸入:
/+1@@/2@@4@@-+3@@6@@+4@@8@@
輸出:
(1+2/4)/(3+6-(4+8))=-0.5
主要思路,我們來看一看二叉樹遍歷的順序:
中序遍歷:左,中,右,正好是算式的中序算式;
後序遍歷:左,右,中,正好是算式的後序算式;
所以對於求值,我們直接後序遍歷,然後利用後序算式的性質,利用棧即可求出;
對於算式,我們要考慮加一些括號,根結點優先順序高時要加括號,需要注意的是,當根結點為「-」時,左子樹不管是什麼,都不需要加括號。
完整**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair pll;
typedef pair<
int,
int> pii;
typedef queue<
int> q_i;
typedef queue q_s;
typedef queue<
double
> q_d;
typedef queue q_ll;
typedef queue<
char
> q_c;
typedef priority_queue<
int> pq_i;
typedef priority_queue pq_s;
typedef priority_queue<
double
> pq_d;
typedef priority_queue pq_ll;
typedef stack<
int> s_i;
typedef stack s_s;
typedef stack<
double
> s_d;
typedef stack s_ll;
typedef stack<
char
> s_c;
typedef map m_ll_ll;
typedef map<
int,ll> m_i_ll;
typedef map<
int,
int> m_i_i;
typedef map m_s_ll;
typedef map<
char
,int
> m_c_i;
typedef map<
char
,ll> m_c_ll;
const ll inf=
0x3f3f3f3f
;#define rep(i,l,r) for(ll i=l;i<=r;i++)
#define per(i,l,r) for(ll i=r;i>=l;i--)
#define eif else if
#define n 2000005
#define mm(dp) memset(dp,0,sizeof(dp))
#define mm1(dp) memset(dp,-1,sizeof(dp))
#define mm2(dp) memset(dp,0x3f,sizeof(dp))
#define it set::iterator
#define fs(n) fixed<< setprecision(n)
const
double e=
2.71828182845
;const
double pi =
acos(-
1.0)
;class stack
void
empty1()
void
push
(double u)
void
pop(
)double
top(
)void
bian()
}};class tree
;struct node *p,
*t,*head=
null
,*q;
int flag1[
200005];
int pos1=0;
void
create1
(string str1,
int n,
struct node*
&head1)
}void
bianli
(struct node *t1,
int u)
}bianli
(t1->left,u+1)
;bianli
(t1->right,u+1)
;}void
zhong
(struct node *t1,
int u)
void
zhong1
(struct node *t1,
char ch,
char x)
bool judge
(char ch1,
char ch2,
char x)
string sss="";
void
hou(
struct node *t1,
int u)
void
hou1
(struct node *t1,
int u)
stack st1;
double
yunsuan
(string s,
int n)
else
if(s[i]
=='-')if
(s[i]
=='*')if
(s[i]
=='/')}
}return
1.0*st1.
top();
}};map<
char
,int
string qian="";
intmain()
/*/+1@@/2@@4@@-+3@@6@@+4@@8@@
(1+2/4)/(3+6-(4+8))=-0.50000
*/
資料結構與演算法 實驗七
1 實現二叉樹的插入操作,並利用先序遍歷的實現列印。如圖所示 列印的結果為 abcdfge include stdlib.h include stdio.h typedef char datatype include bitree.h void main typedef struct node bi...
資料結構與演算法實驗祝恩 《資料結構與演算法》實驗報告
保持青春的秘訣,是有一顆不安分的心。資料結構與演算法 實驗報告 模板 實驗題目 線性表綜合實驗 班級 姓名 學號 完成日期 一 實驗目的 熟悉線性表的基本操作在兩種儲存結構上的實現,其中以熟悉各種鍊錶的操作為重點。通過具體應用例項在複習高階程式語言使用方法的基礎上初步了解資料結構的應用。二 實驗內容...
資料結構與演算法實驗報告 實驗一 鍊錶
實驗一 鍊錶 實驗目的和要求 1.理解線性表的鏈式儲存結構。2.熟練掌握動態鍊錶結構及有關演算法的設計。根據具體問題的需要,設計出合理的表示資料的鍊錶結構,並設計相關 演算法。實驗任務 1.對任意輸入的一組資料,建立乙個遞增有序的單鏈表。2.將單鏈表 中的奇數項和偶數項結點分解開,並分別連成乙個單鏈...