02-线性结构4 Pop Sequence

题目

02-线性结构4 Pop Sequence_第1张图片

 思路

如果从最终序列直接判断,“不出现 大、小、中”与”序列合法“是等价的。复杂度是O(n³)

进行一些化简,可得O(n²)

而直接模拟进栈出栈顺序,复杂度是O(n)

code

# include 

struct Stack {
	int capacity;
	int size;
	int elem[1010];

	Stack(int c):capacity(c), size(0){}
	void clear(void) { size = 0; }
	bool empty(void) { return size == 0; }

	bool push(int val) 
	{
		if (size == capacity) return false;
		elem[++size] = val;
		return true;
	}

	int pop(void)
	{
		return elem[size--];
	}

	int & top(void)
	{
		return elem[size];
	}
	
};

int main(void)
{
	int capacity;
	int N;
	int K;
	std::cin >> capacity >> N >> K;
	Stack A(1010), B(capacity);

	while (K--)
	{
		bool ans = true;

		// 栈初始化
		A.clear();
		B.clear();
		for (int i = N; i >=1; --i) A.push(i);

		int current;
		for (int i = 0; i < N; ++i)
		{

			std::cin >> current;
			if (!ans) continue;
			if (!A.empty() && current >= A.top())
			{
				// A出栈,进入B(可能出现异常之处:B栈满)
				while (!A.empty() && current >= A.top())
				{
					if (!B.push(A.pop())) ans = false; 
				}
				B.pop();
			}
			else
			{
				// B出栈(可能出现异常之处:出的并不是current)
				if (B.pop() != current) ans = false;
			}
		}
		if (ans) std::cout << "YES\n";
		else std::cout << "NO\n";
	}
	return 0;
}

你可能感兴趣的:(ZJU数据结构,算法,数据结构)