1. 程式人生 > >Tarjan中棧的分析與SLT棧的實現

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

般的 col 評論 while spa tarjan 棧的實現 class 當前

首先看一下手寫的棧:

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();

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

謝謝

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