栈
定义:限定仅在
表头进行
插入和
删除操作的
线性表。
特点:一种可以实现“
先进后出”的数据结构。
应用场景:
函数调用、
中断、
表达式求值、
内存分配、
缓冲处理、
迷宫。
分类:
①
静态栈。
②
动态栈。
基本操作:
进栈、
出栈。
栈的
内部结构如下:
// structure of stack
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
} STACK, * PSTACK;
栈的一些
常见操作的代码实现:
初始化栈
// initialize stack
void init_stack(PSTACK pStack)
{
pStack->pTop = (PNODE)malloc(sizeof(NODE));
if (NULL == pStack->pTop)
{
printf("Error in dynamically allocating memory!");
exit(-1);
}
else
{
pStack->pBottom = pStack->pTop;
pStack->pTop->next = NULL; // pStack->pBottom->next = NULL;
}
}
进栈
// push an element into a stack
void push(PSTACK pStack, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE);
pNew->data = val;
pNew->next = pStack->pTop;
pStack->pTop = pNew;
}
出栈
// pop an element from a stack
bool pop(PSTACK pStack, int * pVal)
{
if (pStack->pTop->next = NULL)
{
return false;
}
PNODE pTemp = pStack->pTop;
*pVal = pTemp->data;
pStack->pTop = pTemp->next;
free(pTemp);
return ture;
}
遍历一个栈中的数据元素
// traverse a stack
void traverse_stack(PSTACK pStack)
{
PNODE p = pStack->pTop;
while (p != pStack->pBottom)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
清空栈中元素
// clear stack
void clear(PSTACK pStack)
{
if (NULL == pStack->pTop->next)
{
return;
}
/* method 1
PNODE p = pStack->pTop;
while (p != pStack->pBottom)
{
pStack->pTop = p->next;
free(p);
p = p->next;
}
*/
// method 2
PNODE p = pStack->pTop;
PNODE q = NULL;
while (p != pStack->pBottom)
{
q = p->next;
free(p);
p = q;
}
pStack->pTop = pStack->pBottom;
}