Tarjan中棧的分析與SLT棧的實現

自為風月馬前卒發表於2017-07-11

首先看一下手寫的棧:

1 do{
2     printf("%d ",stack[index]);
3     visit[stack[index]]=0;
4     index--;
5     }while(x!=stack[index+1]);//出棧,並且輸出。
6 printf("\n");

我們可以發現。x是與index的上一個元素比較的

 

舉個例子

棧:1 3 2 4 5     x=2

這樣的話會輸出 5  4   2

 

但是stl不支援和棧頂的上一個元素比較,因為上一個元素一定是被pop掉的。

那麼我們可以怎麼實現呢?

 

1.首先我們需要明白一點,如果我們把迴圈的條件改為

 1 x!=stack.top; 

 

那麼當棧已經空的時候,還是會執行一下判斷操作,這樣就會導致re,

所以我們可以記錄下pop之前的元素,這樣就可以保證在判斷的時候不會越界,而且是與pop之前的元素進行比較的

code:

 

1 int h;
2 do
3 {
4     h=s.top();
5     if(!color[s.top()])
6     color[s.top()]=colornum;
7     vis[s.top()]=0;
8     s.pop();
9 }while(now!=h);

 

 

 

 

2.一般的do while語句都可以用while語句來實現

我們如果單純的把do while改成while,

那麼在上面的例子中會輸出 5  4

所以我們還需要判斷一次,把當前的棧頂給輸出

程式碼:

 1 while(now!=s.top())
 2 {
 3     if(!color[s.top()])
 4     color[s.top()]=colornum;
 5     vis[s.top()]=0;
 6     s.pop();
 7 }
 8 if(!color[s.top()])
 9 color[s.top()]=colornum;
10 vis[s.top()]=0;
11 s.pop();

 

如果你還有其他什麼寫法的話歡迎發表評論或者通過其他方式聯絡我。

謝謝

 

相關文章