1. 程式人生 > >【C++】判斷順序棧出棧順序的合法性

【C++】判斷順序棧出棧順序的合法性

//判斷順序棧出棧順序的合法性思想:
//給定一個入棧的字串pushstr,再給定一個出棧的字串popstr,根據棧的特性,判斷該出棧順序是否合法
//1.先驗證兩個字串的長度是否相等,不等,則肯定不合法;相等,再進行步驟2.
//2.(1)判斷pushstr與popstr當前所指向的字元的關係:
//  (2)當*pushstr != *popstr時,對*pushstr進行壓棧操作後,pushstr指標向後走,轉(1)操作。
//  (3)當*pushstr == *popstr時,popstr指標向後走,驗證popstr的下一個字元是否合法(方法:當棧不為空且棧頂
//      元素與該字元相等時,說明合法,則執行出棧操作,popstr指標接著向後走,再驗證popstr的下一個字元是否合
//      法)。若不合法,則pushstr指標向後走,轉(1)操作。


#include<iostream>
#include<stack>
using namespace std;
bool Is_Legle(stack<char>&s, const char *&pushstr, const char *&popstr)
{
	if (strlen(pushstr) != strlen(popstr))
	{
		return false;
	}
	while (*pushstr != '\0')
	{
		if (*pushstr != *popstr)
		{
			s.push(*pushstr);
		}
		else
		{
			popstr++;
			while (!s.empty() && s.top() == *popstr)
			{
				s.pop();
				popstr++;
			}
		}
		pushstr++;
	}
	if (s.empty() && *popstr == '\0')
	{
		return true;
	}
	else
	{
		return false;
	}
}
int main()
{
	stack<char>s;
	const char *src = "12345";
	const char *dst = "24531";
	if (Is_Legle(s, src, dst))
	{
		cout << "出棧順序合法" << endl;
	}
	else
	{
		cout << "出棧順序不合法" << endl;
	}
	system("pause");
	return 0;
}