【資料結構】給出入棧序列判斷出棧序列的合法性
阿新 • • 發佈:2019-01-27
給定一個出棧序列,判斷該序列是否合法
方法如下:
1.設定一個輔助棧來儲存壓入棧而尚未出棧的元素
2.假設壓棧序列 {a,b, c, d, e };
3.給定一個出棧序列{c,a, ,b d, e,};
4.判斷如下
通過cur遍歷壓棧序列,通過str遍歷出棧序列
cur指a,str指c
判斷cur和str的內容是否相等
如果不相等:就把cur所指的內容壓入輔助棧
輔助棧:a】 (】表示棧底)
繼續遍歷cur,cur指b,不相等
輔助棧:b a】
cur繼續走,相等
cur和str都指向下一個內容
cur指d,str指a
接下來判斷str和輔助棧棧頂元素相等否,不相等(a元素在輔助棧中但是不在棧頂,
就表示該出棧序列是錯誤的了)
所以該序列是錯誤的出棧序列
主程式碼如下:
/*判斷給定的字串是否按照出棧順序*/ int Juge(LinkStack* stack1, LinkStack* stack2, char* str) { if (stack1 == NULL) { return; } if (stack2 == NULL) { return; } Node* cur = stack1->top; while (cur != stack1->bottom ) { /*如果輔助棧不為空,而且輔助棧頂元素的值和str值的字元相等*/ if (!LinkStackEmpty(stack2) && stack2->top->data == *str) { /*出棧輔助棧top*/ LinkStackPop(stack2); str++; } else { /* *輔助棧為空,或者cur的值和str值不相等 *遍歷stack1 */ while (cur->data != *str) { /*不相等,就把棧1的元素壓棧入棧2*/ StackType value = cur->data; LinkStackPush(stack2, value); /*然後讓cur前進一步*/ cur = cur->next; /*判斷是不是cur到末尾了*/ if (cur == stack1->bottom) { return 0; } } cur = cur->next; str++; } } /*出來以後,判斷輔助棧是不是為空*/ if (!LinkStackEmpty(stack2)) { /*如果不為空,代表該字串序列是錯誤的*/ return 0; } return 1; }
測試程式碼如下:
void TestJuge() { LinkStack* stack1 = InitStack(); LinkStack* stack2 = InitStack(); TESTHEAD; LinkStackPush(stack1, 'e'); LinkStackPush(stack1, 'd'); LinkStackPush(stack1, 'c'); LinkStackPush(stack1, 'b'); LinkStackPush(stack1, 'a'); PrintStack(stack1, "模擬入佇列五個元素"); char* str = "cabde"; int i = Juge(stack1, stack2, str); printf("%d", i); }
程式碼中用到的鏈式棧的程式碼也在我的部落格裡