《C语言》链式反向栈

链式反向栈


Main.c

#include "RevStack.h"



void main()
{

	/*****************先进后出(逆序)*****************/
#if 0
	RevStack* P_Stack = NULL;

	for (int i = 0; i < 10; i++)
	{
		Push(&P_Stack, i * 10, i);
	}
	while (NULL != P_Stack)
	{
		RevStack temp;
		Pop(&P_Stack, &temp);
		printf("%d\n", temp.Data);
	}

#endif

	/*****************进一个出一个(顺序)*****************/
#if 0
	RevStack* P_Stack = NULL;

	for (int i = 0; i < 10; i++)
	{
		Push(&P_Stack, i * 10, i);
		while (NULL != P_Stack)
		{
			RevStack temp;
			Pop(&P_Stack, &temp);
			printf("%d\n", temp.Data);
		}
	}
#endif
	/*****************销毁栈*****************/
#if 0
	RevStack* P_Stack = NULL;

	for (int i = 0; i < 10; i++)
	{
		Push(&P_Stack, i * 10, i);
	}

	Destroy(&P_Stack);
	while (NULL != P_Stack)
	{
		RevStack temp;
		Pop(&P_Stack, &temp);
		printf("%d\n", temp.Data);
	}
#endif
	
	/*****************十进制转二进制*****************/
#if 1
	RevStack* P_Stack = NULL;

	int Num = 10;
	while (Num)
	{
		Push(&P_Stack, Num % 2, 0);
		Num /= 2;
	}
	
	while (NULL != P_Stack)
	{
		RevStack temp;
		Pop(&P_Stack, &temp);
		printf("%d\n", temp.Data);
	}
#endif

	system("pause");
}

RevStack.h

#pragma once


#ifdef __cplusplus
extern "C"
{
#endif

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

	typedef int DataType;

	typedef struct Stack
	{
		DataType Data;
		int ID;
		struct Stack* P_Next;
	}RevStack;

	//初始化节点
	void InitNode(RevStack* P_Node);
	//压栈
	void Push(RevStack** PP_Head, DataType Data, int ID);
	//出栈
	void Pop(RevStack** PP_Head, RevStack* PopNode);
	//显示栈
	void Show(RevStack* P_Head);
	//销毁栈
	void Destroy(RevStack** PP_Head);
#ifdef __cplusplus
}
#endif

RevStack.c

#include "RevStack.h"


//初始化
void InitNode(RevStack* P_Node)
{
	if (NULL != P_Node)
	{
		P_Node->P_Next = NULL;
	}

}

//压栈
void Push(RevStack** PP_Head, DataType Data, int ID)
{
	RevStack* P_New = (RevStack*)malloc(sizeof(RevStack));
	P_New->P_Next = NULL;
	P_New->Data = Data;
	P_New->ID = ID;

	if (NULL == *PP_Head)
	{
		*PP_Head = P_New;
	}
	else
	{
		P_New->P_Next = *PP_Head;
		*PP_Head = P_New;
	}
}

//出栈
void Pop(RevStack** PP_Head, RevStack* PopNode)
{
	if (NULL == *PP_Head)
	{
		return;
	}
	else if (NULL == (*PP_Head)->P_Next)
	{
		PopNode->ID = (*PP_Head)->ID;
		PopNode->Data = (*PP_Head)->Data;

		free(*PP_Head);
		*PP_Head = NULL;
	}
	else
	{
		PopNode->Data = (*PP_Head)->Data;
		PopNode->ID= (*PP_Head)->ID;

		RevStack* P_Bak = (*PP_Head)->P_Next;
		free(*PP_Head);
		*PP_Head = P_Bak;
	}
}

//显示栈
void Show(RevStack* P_Head)
{
	if (NULL == P_Head)
	{
		return;
	}
	else
	{
		printf("%p\t%p\t%d\t%d\n", P_Head, P_Head->P_Next, P_Head->Data, P_Head->Data);
		Show(P_Head->P_Next);
	}
}

//销毁栈
void Destroy(RevStack** PP_Head)
{
	if (NULL != *PP_Head)
	{
		RevStack* P1 = *PP_Head;
		RevStack* P2 = NULL;
		while (NULL != P2)
		{
			P2 = P1->P_Next;
			P1 = P2->P_Next;
			free(P2);
			P2 = NULL;
		}
		free(*PP_Head);
		*PP_Head = NULL;
		P1 = NULL;
		P2 = NULL;
	}
}

猜你喜欢

转载自blog.csdn.net/baidu_41905806/article/details/84894885