1. 程式人生 > >【資料結構】給出入棧序列判斷出棧序列的合法性

【資料結構】給出入棧序列判斷出棧序列的合法性

給定一個出棧序列,判斷該序列是否合法

方法如下:

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

程式碼中用到的鏈式棧的程式碼也在我的部落格裡