链式反向栈
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;
}
}