關於棧的幾道面試題目

bigface1234fdfg發表於2015-02-24

1. 括號匹配

http://wenku.baidu.com/link?url=ExL5fVcWJJR2x_l5AWK9znXY98YGwLSYo56ZJtju4Ql6dJKvkHWGkBNPcfGLzm57bIQFwQKFt1dRgjE27N8EMfD462UyYtjGo3d_A8WZbna


主要解題思想是遇到左括號,入棧;遇到右括號,出棧。當發現需要出棧的元素不匹配的時候,說明括號不能匹配,否則,括號匹配。


2. 表示式計算

http://blog.chinaunix.net/uid-26833883-id-3156975.html


主要解題思路是使用兩個棧,一個棧存放運算的資料,一個棧存放運算子,注意需要考慮運算優先順序,以及是否有括號運算。


3. 兩個棧實現佇列,還有兩個佇列實現棧的功能

http://www.cppblog.com/csu-yx-2013/archive/2012/03/11/167673.aspx  (先看下面的程式碼,有我的註釋,再看這個連結)


http://blog.csdn.net/cfan0801/article/details/7351574 (輔助)


#include <cstdlib>  
#include <iostream>  
#include <stack>  
/*兩個棧實現佇列*/  
using namespace std;  
template<class T>  
struct MyQueue  
{  
       void push(T &t)  
       {  
            s1.push(t);  
       }  
       T front()   // 實現佇列的front功能
       {  
                if(s2.empty())  
                {  
                              if(s1.size()==0) throw;  
                              while(!s1.empty())  
                              {  
                                                s2.push(s1.top());  //  先把棧s1的元素轉移到s2中
                                                s1.pop();  
                              }  
                }  
                return s2.top();  // 棧s2的頂部元素,就是棧s1的底部元素,實現了佇列的front功能,即取頭元素
       }  
       void pop()  
       {  
            if(s2.empty())  
            {  
                          while(!s1.empty())  
                          {  
                                            s2.push(s1.top());  // 同上
                                            s1.pop();  
                          }  
            }  
            if(!s2.empty())   
            s2.pop();           // pop掉s2的頂部元素,就是pop佇列的頭元素
       }  
       stack<T> s1;  
       stack<T> s2;  
};  
int main(int argc, char *argv[])  
{  
    MyQueue<int> mq;  
    int i;  
    for(i=0;i<10;++i)  
    {  
                     mq.push(i);  
    }  
    for(i=0;i<10;++i)  
    {  
                     cout<<mq.front()<<endl;  
                     mq.pop();  
    }  
    system("PAUSE");  
    return EXIT_SUCCESS;  
}  




4. 棧實現最小值

http://blog.csdn.net/puqutogether/article/details/43916945

5. Linux簡化檔案路徑



這個比較簡單,基本解題思路是以/分隔字串,遇到 . 和 空格什麼都不做,遇到..退棧,其他都進棧,最後把棧中的都用/連線起來就是簡化後的路徑。


舉個例子:
path = "/a/./b/../../c/", => "/c"


壓棧a,壓棧b,遇到..需要出棧b,遇到..需要出棧a,壓棧c。
結果返回棧內只有的c。




相關文章