【数据结构】给出入栈序列判断出栈序列的合法性

通过辅助栈模拟压栈过程,验证给定的出栈序列是否合法。若出栈序列中元素未先压栈或出栈顺序错误,则序列非法。核心判断在于比较当前遍历的压栈元素和出栈元素,若不一致则压入辅助栈,否则检查栈顶元素是否匹配。代码实现包括主函数和测试用例。


给定一个出栈序列,判断该序列是否合法

方法如下:

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

代码中用到的链式栈的代码也在我的博客里



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值