1. 程式人生 > >資料結構之棧與佇列的面試題:判斷字串是否按照出棧順序

資料結構之棧與佇列的面試題:判斷字串是否按照出棧順序

可能這個題目猛一看,並不知道題目要求是什麼,讓我們做什麼。首先我們來說說這個題目大意。
給定一個字串,如:a b d e c
一個棧的入棧順序為:a b c d e
那麼出棧順序顯而易見:e d c b a
題目意思為:字串 a b d e c 是否能按出棧順序所打出。比如說,我們先入棧a元素,接著再將a元素出棧,則得到a元素,接著再入b元素,同理出棧,再入c元素,發現與字串d元素並不一致,那麼繼續入棧,入d元素,發現與字串元素一致,繼續出棧,依次類推,最終得到我們的字串abdef,不過整個過程中,我們只執行了入棧出棧操作,並沒有改變其入棧出棧的順序。這就是所要考的內容,給定任意入棧順序,任意字串,判斷字串是否能夠根據入棧出棧操作得到即可。

這裡我們的思路大致是,每次入棧後取棧頂元素與字串比較,如果一致則出棧棧頂元素,接著比較下一個棧頂是否與字串第二個元素一致,如果不一致,繼續入棧,以此類推,直至入棧結束,或者是字串到最後一個元素,即可判斷。

//實現如下
#include <stdio.h>
#include "seqstack.h"

int str_instack(SeqStack* s, char* str1, char* str2, int len)//str1位入棧順序,str2位字串
{
  if(str1 == NULL || str2 == NULL) {
    return -1;
  }

  SeqStackType top;
  SeqStackInit(s);
  int
i = 0; for(; i < len; ++i) { SeqStackPush(s, *str1); SeqStackGetFront(s, &top);//取棧頂元素比較 while(top == *str2) { SeqStackPop(s); SeqStackGetFront(s, &top); str2++; } if(*str2 == '\0') {//如果str2到達'\0'證明字串判斷結束,即可以經過入棧出棧得到字串 return 1; } str1++; } return
-1; }

這裡我們用了簡單的棧的操作來幫助我們實現。

//測試程式碼如下
int main()
{
  SeqStack s;
  int ret;
  char str1[5] = {'a', 'b', 'c', 'd', 'e'};
  char str2[5] = {'a', 'c', 'd', 'e', 'b'};
  char str3[5] = {'a', 'd', 'b', 'e', 'c'};
  int len = sizeof(str1)/sizeof(str1[0]);

  ret = str_instack(&s, str1, str2, len);
  printf("expected ret 1,actual ret %d\n",ret);

  ret = str_instack(&s, str1, str3, len);
  printf("expected ret -1,actual ret %d\n",ret);

  return 0;
}

歡迎大家共同討論,如有錯誤及時聯絡作者指出,並改正。謝謝大家!