给定入栈序列,判断可能的出栈序列

#include<stdio.h>
//用于表示顺序栈 
typedef struct{
	int data[1000];
	int top;
	int length;
}SeqStack;
//用于表示入栈序列 
typedef struct{
	int data[1000];
	int top;
	int length;
}SeqData;
//用于表示一个可能的出栈序列 
typedef struct{
	int data[1000];
	int top;
	int length;
}TestData;

/*顺序栈的基本操作-start*/ 
int emptyStack(SeqStack* stack){
	if(stack->top == -1){
	//	printf("栈为空\n");
		return 1; 
	}
	else{
	//	printf("栈不为空\n");
			
		return 0;
	}
};
void initStack(SeqStack* stack,int length){
	stack->top = -1;
	stack->length = length;
} 
int fullStack(SeqStack* stack){
	if(stack->top == stack->length - 1){
//		printf("栈满\n");
		//getchar();
		return 1; 
	}
	else{
	//	printf("栈不满\n");
		return 0;
	}
	
} 
int pushStack(SeqStack* stack, int data){
	if(!fullStack(stack)){
	//	printf("入栈前top为:%d",stack->top);
		stack->data[++(stack->top)] = data;
		//getchar();
	//	printf("入栈后top为:%d",stack->top);
	//	printf("入栈成功,入栈数为:%d",stack->data[stack->top]); 
		return 1;
	}
	else{
	//	printf("入栈失败");
		return 0;	
	}
} int popStack(SeqStack* stack){
	if(!emptyStack(stack)){
	//	printf("出栈数为:%d\n",stack->data[stack->top]);
		stack->top--;
	//	printf("出栈成功");
		return 1;
	}
	else{
	//	printf("出栈失败");
		return 0;	
	}
} 
/*顺序栈的基本操作-end*/ 
int main(){
	SeqStack stack;
	TestData testData;
	SeqData seqData;
	int M, N ,K; 

	scanf("%d %d %d",&M, &N, &K);
	initStack(&stack,M);
	testData.length = N;
	seqData.length = N;
	//输入入栈序列 
	 for(int i = 0; i < seqData.length; i++){
 		scanf("%d", &seqData.data[i]);
 	}
	for(int j = 0; j < K; j++){
	         /*测试每个出栈序列时,都需要更新条件*/ 
			 stack.top = -1;
	         seqData.top = 0;
			 testData.top = 0;
			 
			 for(int t = 0; t < testData.length;t++)
 				scanf("%d", &testData.data[t]);
		
				 
				while(testData.top < testData.length && stack.top < stack.length && seqData.top <= seqData.length){
 						//	printf("进去while循环");
 						//	getchar();
			
 						if(!emptyStack(&stack)){
						 	if(stack.data[stack.top] == testData.data[testData.top]){
		 						popStack(&stack);
		 						testData.top++;
					 		}
					 		else
			 					pushStack(&stack, seqData.data[seqData.top++]);
						 }
					 		
				 		else
			 			      pushStack(&stack, seqData.data[seqData.top++]);		
		 		}	
		 	if(testData.top == testData.length)
		 		printf("yes\n");
	 		else
			 	printf("no\n");	
	}
	return 0;	
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值