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標準模板庫簡介