STL是所有C++编译器和所有操作系统平台都支持的一种库,可以用于所有C++语言编译器和所有平台(Windows/Unix/Linux..)。当然标准查模板库中的所有算法,也可以自己用C/C++来实现,只是STL已经是封装好的库,说明它的实现细节已经做过很多优化,自己写的未必会比库中的效率高,那为什么机试题中,更偏向于自己去实现算法呢?主要是考察我们对语言的使用技巧及对常用算法原理的理解。
上机题中,一般都侧重于考察C语言的使用熟练程度,C语言也是跨平台的,因为更底层一些,因为C的执行效率和程序占用空间小,所以C语言经常用在嵌入式程序设计中。很少看到有同学用C++标准模板库来实现的,其实题目中没有要求不能使用C++标准模板库,采用C++ STL可以大大的节省时间,因为STL中已经封装好很多常用的算法,可以直接拿过来用,像sort排序等
前面用过vector容器和sort排序,这些都是STL中的,vector很容易实现动态数组,而不会像以前C语言中实现动态数组要先分配空间,最后要释放空间这么麻烦,vector容器对这些细节已经封装好,对用户是透明的,这些细节不用管
下面是自己用标准模板库中的容器——栈来实现字符串四则运算的实现,例如:输入"1+4*5-8/3",输出结果是19
这题最常用的方法就是用栈来实现,下面是示例代码:
#include <iostream>
#include <stack>
using namespace std;
//不带括号的四则运算,如果带括号,操作符的优先级就有'='
//比较两个操作符的优先级
char optCompare(char a,char b){
if(a=='+' || a=='-'){
if(b=='+' || b=='-'){
return '>';
}else{
return '<';
}
}else{//如果a是*/,那么b无论是什么操作符,都是>
return '>';
}
}
int compute(int x,char optr,int y){
int ret;
switch(optr){
case '+':
ret=x+y;
break;
case '-':
ret=x-y;
break;
case '*':
ret=x*y;
break;
case '/':
ret=x/y;
break;
}
return ret;
}
//测试栈
void main(){
stack<int> dat;//运算数栈
stack<char> optr;//运算符栈
string str="1+4*5-8/3";
for(int i=0;i!=str.size();i++){
if(str[i]>='0' && str[i]<='9'){
dat.push((int)str[i]-48);//将字符转成数字进栈
}else{
if(optr.empty()){
optr.push(str[i]);
}else{
if(optCompare(optr.top(),str[i])=='<'){
optr.push(str[i]);
}else{//栈顶元素优先权高,退栈并将运算结果入栈
int a=dat.top();
dat.pop();
int b=dat.top();
dat.pop();
dat.push(compute(b,optr.top(),a));
optr.pop();
optr.push(str[i]);
}
}
}
}
while(optr.empty()==false){//计算最终结果
int a=dat.top();
dat.pop();
int b=dat.top();
dat.pop();
dat.push(compute(b,optr.top(),a));
optr.pop();
}
cout<<"the result is "<<dat.top()<<endl;
}
当然这题也可以自己定义栈的数据结构来实现,显然直接使用stack容器要简便的多
下面参考资料详细节绍了C++标准模板库,以便以后用的时候查阅
1.http://www.sgi.com/tech/stl/ //STL官网,可以直接查API函数
2.http://net.pku.edu.cn/~yhf/UsingSTL.htm
3.http://morningspace.51.net/resource/stlintro/stlintro.html
4.http://blog.csdn.net/zlgrj1986/article/details/2252787
5.http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html
6.http://www.vckbase.com/document/viewdoc/?id=1461
7.http://www.linuxsir.org/bbs/showthread.php?threadid=86454 //Linux上的C++ STL标准模板库简介