C++机试还是会常考栈,哈夫曼树,二叉树,hash算法等数据结构的内容。
1.栈的应用:只能在一端进行插入和删除操作,先进后出。
常以stack<int> S 定义一个栈
stack<int> s;
int main(){
s.push(1);
s.push(5);
s.push(4);
while(!s.empty()){
cout << s.top() << endl;
s.pop();
}
return 0;
//4 5 1
}
括号匹配:假设表达式中允许包含两种括号:圆括号和方括号。编写一个算法判断表达式中的括号是否正确配对。
输入:[([][]())]
输出:YES
int main(){
char s[300];
scanf("%s",&s);
int len = strlen(s);
stack<char> st;
for(int i=0;i<len;i++){
if(!st.empty()){
char now = st.top();
if(s[i]==')' and now =='(' or
s[i] == ']' and now == '[' ) st.pop();
else st.push(s[i]);
}
else st.push(s[i]);
}
if(!st.empty()) printf("NO\n");
else printf("YES\n");
return 0;
}
2.哈夫曼树(最优二叉树):树的带权路径长度达到最小
题目:
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n-1 次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有 3 种果子,数目依次为 1,2,9。可以先将 1、2 堆合并,新堆数目为 3,耗费体力为 3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12,耗费体力为 12。所以多多总共耗费体力=3+12=15。可以证明 15 为最小的体力耗费值。输入:31 2 9
输出:15题目解析:想要求得最小值必然是每次合并最小两个元素即可。然而在合并的过程中产生的新的数不一定是最小的,所以在每一次合并的过程中我们都需要重新排序找出当前最小的两个数。但是如果每一次合并就要重新全部排序,复杂度太高,不能接受。于是,我们就想到了使用优先队列来维护单调性。