ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

出栈序列的合理性《数据结构》

2021-06-04 20:55:16  阅读:187  来源: 互联网

标签:递减 出栈 int top 合法 数据结构 Stack 合理性


在这里插入图片描述

#include <stdio.h>

int m,n,k;
int STACK[1010];
int Out_STACK[1010];

void Judeg_Stack()
{

    while(k--)
    {
        int flag = 1;
        int i;
        int Stack_index1 = 1;
        int Stack_index2 = 1;
        int Stack_top = 0;
    	for( i=1; i<=n; i++ )
        {
    	  scanf("%d",&Out_STACK[i]);
        }
    	while(1)
    	{

			if( Stack_top!=0 && STACK[Stack_top-1] == Out_STACK[Stack_index2] )
			{
				Stack_top --;
				Stack_index2 ++;
			}
    		else if( Stack_index1 == Out_STACK[Stack_index2] )
    		{
    			Stack_index1++;
    			Stack_index2++;
			}
			else
			{
				if( Stack_index1 > n )
				{
                    break;
				}
				STACK[Stack_top] = Stack_index1;
				Stack_top ++;
				Stack_index1 ++;
				if(Stack_top >= m)
				{
					flag = 0;
					break;
				}
			}
		}
		if( flag==0 || Stack_top!=0 )
            printf("NO\n");
		else
            printf("YES\n");
	}
}

int main()
{
    scanf("%d%d%d",&m,&n,&k);
    Judeg_Stack();
	return 0;
}

运行结果截图:
在这里插入图片描述

规则是出栈时,在一个数之后没遇到比这个数大之前的数都是呈倒序的。例如:5 6 4 3 7 2 1。6,7之间呈倒序,7之后呈倒序,因此可用此方法进行筛选。

简化规则描述:

1、假设入栈顺序为1234。

1)若出栈序列为4123,显然不满足上述要求,因为对于4,它后面比它小的数字序列为123,而123是一个递加系列即不是递减排列,所以不是合法出栈序列。

2)若出栈系列为3142,也不合法,因为3后面比它小的1和2不是递减排列的。

3)若出栈系列为1234,则合法,因为对于每一个数字它后面没有比它小的数字。

2、假设入栈顺序为123456789abcdef。

1)若出栈系列为67d51f94e2ba83c,因为对于d,它后面比它小的19或123或ac等等都不是递减的,所以不合法。

2)若出栈系列为379a8b65c4ed21f,可以证明是合法的出栈顺序。因为对于每一个数字它后面没有比它小的数字而且是按递减排列的。

证明:

假设入栈顺序为1234…n,可知在栈中的元素从栈顶到栈底一定是按严格递减排列的,而且每个数i进栈之前,比i小的数一定已经进栈了。

所以比i小的数要不然已经出栈,要不然在栈中,如果还在栈中则一定在i的下面,按严格递减排列,如此可见如果比i小的数还在栈中则一定在i之后输出,所以输出序列中在i后面的比i小的数一定按严格递减排列.否则出栈系列不合法。

标签:递减,出栈,int,top,合法,数据结构,Stack,合理性
来源: https://blog.51cto.com/u_15249901/2865682

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有