【数据结构】元素入栈出栈的合法性判断

栈:https://blog.csdn.net/weixin_41892460/article/details/82973851

CheckStack.h

#ifndef  __CHECKSTACK_H__
#define __CHECKSTACK_H__


#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
#include <malloc.h>

typedef int  DataType;

typedef  struct Stack
{
	DataType* _a;
	size_t  _top;
	size_t  _capacity;
}Stack;



void StackInit(Stack* s);
void StackPush(Stack* s, DataType x);
void StackPop(Stack* s);
DataType StackTop(Stack* s);
size_t StackSize(Stack* s);
int StackEmpty(Stack* s);
void StackDestory(Stack* s);


int InOutStackIsValid(int* InOrder, int InSize, int* OutOrder, int OutSize);
void TestCheckStack();



#endif

CheckStack.c

#include "CheckStack.h"




void StackInit(Stack* s)
{
	assert(s != NULL);
	s->_a = (DataType*)malloc(sizeof(DataType)* 10);
	s->_top = 0;
	s->_capacity = 10;
}
void StackDestory(Stack* s)
{
	assert(s);
	s->_a = NULL;
	s->_top = 0;
	s->_capacity = 0;
	free(s);
	s = NULL;
}
void StackPush(Stack* s, DataType x)
{
	DataType* cur;
	assert(s);
	if (s->_top == s->_capacity)
	{
		cur = (DataType*)realloc(s->_a, sizeof(s->_capacity) * 2);
		if (cur != NULL)
		{
			s->_a = cur;
		}
		s->_capacity *= 2;
	}
	s->_a[s->_top++] = x;
}
void StackPop(Stack* s)
{
	assert(s);
	assert(s->_top > 0);
	s->_top--;
}
//DataType StackTop(Stack* s)
//{
//	assert(s);
//	assert(s->_top > 0);
//	return s->_a[s->_top - 1];
//
//}
DataType StackTop(Stack* s)
{
	if (NULL == s)
	{
		printf("栈已空!!!");
		return 0;
	}
	return s->_a[s->_top - 1];
}

size_t StackSize(Stack* s)
{
	assert(s);
	return s->_top++;
}
//int StackEmpty(Stack* s)
//{
//	assert(s);
//	return  s->_top == 0 ? 0 : 1;	
//}

int StackEmpty(Stack* s)
{
	if (NULL == s)
	{
		return 0;
	}
	if (s->_top == 0)
	{
		return 0;
	}
	return 1;
}









Test.c

#include "CheckStack.h"



int InOutStackIsValid(int* InOrder, int InSize, int* OutOrder, int OutSize)
{
	assert(InOrder&&OutOrder);
	Stack s;
	int In = 0;
	int Out = 0;
	if (InSize != OutSize)
		return 0;
	StackInit(&s);


	while (Out < OutSize)
	{
		//栈顶元素与Outorder中的第一个元素不同就入栈
		while (StackTop(&s) != OutOrder[Out] || StackEmpty(&s) == 0)
		{
			if (In < InSize)
				StackPush(&s, InOrder[In++]);
			else
				return 0;
		}
		//栈顶元素和Outorder的第一个元素相同就出栈
		StackPop(&s);
		Out++;
	}
	return 1;

}

void TestCheckStack()
{
	int InOrder[] = { 1, 2, 3, 4, 5 };
	int InSize = sizeof(InOrder) / sizeof(InOrder[0]);
	int OutOrder[] = { 5, 4, 3, 2, 1 };
	int OutSize = sizeof(OutOrder) / sizeof(OutOrder[0]);
	if (InOutStackIsValid(InOrder, InSize, OutOrder, OutSize))
	{

		printf("输出合法!!\n");

	}
	else
	{
		printf("输出不合法!!!\n");
	}
}
int main()
{
	TestCheckStack();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值