数据结构——栈
链式栈结构体
struct Stack包含栈PNODE 类型的顶指针pTop, 栈底指针pBottom;PNODE类型指针指向栈中数据节点**
创建链式栈
malloc 函数分配 Stack 数据结构空间,同时malloc创建节点,pTop、pBottom指针指向该节点,初始化节点的pNext指向NULL。
此节点作为栈的起始地址,pBottom始终指向此节点
数据入栈函数push_stack()
创建入栈的节点,初始化节点数据,插入栈中
#include
#include
#include
struct Nodes {
int data;
struct Node *pNext;
};
typedef struct Nodes NODE, *PNODE;
typedef struct Stack {
PNODE pTop;
PNODE pBottom;
}STACK, *PSTACK;
PSTACK create_stack(void);
void push_stack(PSTACK pS, int val);
bool pop_stack(PSTACK pS, int *pData);
bool is_empty(PSTACK pS);
void traverse_stack(PSTACK pS);
void clear_stack(PSTACK pS);
int main()
{
int data_pop;
//创建一个空的栈,pS指针指向该栈
PSTACK pS = create_stack();
//向该栈中压入数据,遍历该栈并输出栈中的数据
push_stack(pS, 2);
push_stack(pS, 12);
push_stack(pS, 32);
push_stack(pS, 123);
traverse_stack(pS);
pop_stack(pS, &data_pop);
traverse_stack(pS);
//从该栈中推出数据,遍历该栈并输出栈中的数据
if(pop_stack(pS, &data_pop))
printf("pop succeed, the data poped out is: %d\n", data_pop);
else
printf("pop failed\n");
traverse_stack(pS);
//清空栈,遍历该栈并输出栈中的数据
clear_stack(pS);
printf("data cleared!\n");
traverse_stack(pS);
return 0;
}
/**
* @brief Create a stack object
*
* @return PSTACK
*/
PSTACK create_stack(void)
{
PSTACK pS = (PSTACK)malloc(sizeof(STACK));
pS->pTop = (PNODE)malloc(sizeof(NODE));
if(NULL == pS || NULL == pS->pTop) {
printf("malloc failed\n");
exit(-1);
} else {
pS->pBottom = pS->pTop;
pS->pBottom->pNext = NULL;
}
return pS;
}
/**
* @brief 向pS指针指向的栈中压入数据 val
*
* @param pS
* @param val
*/
void push_stack(PSTACK pS, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew) {
printf("malloc failed\n");
exit(-1);
} else {
pNew->data = val;
pNew->pNext = (struct Node *)pS->pTop;
pS->pTop = pNew;
}
return ;
}
/**
* @brief 从栈中推出数据,
* 并将推出的数据保存在pData指针所指向的位置
*
* @param pS
* @param pData
*/
bool pop_stack(PSTACK pS, int *pData)
{
if (is_empty(pS))
return false;
else {
PNODE p = pS->pTop;
*pData = p->data;
pS->pTop = (PNODE)p->pNext;
free(p);
p = NULL;
return true;
}
}
/**
* @brief 判断 pS 所指向的栈是否为空
*
* @param pS
* @return true
* @return false
*/
bool is_empty(PSTACK pS)
{
if (pS->pTop == pS->pBottom)
return true;
else
return false;
}
/**
* @brief 遍历栈 pS,并自栈顶向栈底输出栈中的数据
*
* @param pS
*/
void traverse_stack(PSTACK pS)
{
PNODE pCurrent = pS->pTop;
printf("Now datas int the stack are:\n");
while (pCurrent != pS->pBottom)
{
printf("%d ", pCurrent->data);
pCurrent = (PNODE)pCurrent->pNext;
}
printf("\n");
return ;
}
/**
* @brief 清空栈 pS,即将其还原位空栈
*
* @param pS
*/
void clear_stack(PSTACK pS)
{
if (is_empty(pS)) {
return ;
} else {
PNODE p = pS->pTop;
PNODE r = NULL;
while (p != pS->pBottom)
{
r = (PNODE)p->pNext;
free(p);
p = r;
}
pS->pTop = pS->pBottom;
}
}