本例子讲述了如何创建一个栈,压栈即往栈里插入一个结点,删除栈顶元素,以及对栈里的结点进行清空,遍历栈里的结点
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <errno.h>
typedef struct Node
{
int data; //数据域
struct Node *pNext; //指针域
}NODE, *PNODE;
typedef struct Stack
{
PNODE pTop; //栈顶
PNODE pBottom; //栈底
}TSTACK, *PSTACK;
//初始化栈
int init(PSTACK _pSt)
{
_pSt->pTop = (PNODE)malloc(sizeof(NODE)); //为栈顶分配内存
if(NULL == _pSt->pTop)
{
printf("----malloc fail errno= %d\n", errno);
return -1;
}
else
{
_pSt->pBottom = _pSt->pTop; //栈底指向了栈顶
_pSt->pBottom->pNext = NULL; //将栈底指针域赋为空
}
return 0;
}
//压栈,往栈里写数据
int push_stack(PSTACK _pSt, int _iVal)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("----Push_stack fail, errno\n", errno);
return -1;
}
else
{
pNew->data = _iVal; //将待入栈的数据写入数据域中
pNew->pNext = _pSt->pTop; //将新结点的指针域指向之前的栈顶
_pSt->pTop = pNew; //栈顶指向新结点
}
}
//判断栈是否为空栈
int Is_empty(PSTACK _pSt)
{
if(_pSt->pTop == _pSt->pBottom) //如果栈顶与栈底相等说明栈为空
{
return 1;
}
else
{
return 0;
}
}
//对栈进行遍历
void ergodic_stack(PSTACK _pSt)
{
if(1 == Is_empty(_pSt))
{
printf("----This stack is empty\n");
}
else
{
PNODE Temporary_node;
Temporary_node = _pSt->pTop;
while(Temporary_node != _pSt->pBottom) //不等于栈底
{
printf("%d ", Temporary_node->data);
Temporary_node = Temporary_node->pNext;
}
printf("\n");
}
}
//删除栈顶元素
void pop_stack(PSTACK _pSt)
{
if(1 == Is_empty(_pSt))
{
printf("----This stack is empty\n");
}
else
{
PNODE Temporary_node;
Temporary_node = _pSt->pTop;
_pSt->pTop = _pSt->pTop->pNext;
free(Temporary_node);
Temporary_node = NULL;
}
}
//清空栈
void clear_stack(PSTACK _pSt)
{
if(1 == Is_empty(_pSt))
{
printf("----This stack is already empty\n");
}
else
{
PNODE p = _pSt->pTop;
PNODE q = NULL;
while(p != _pSt->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
_pSt->pTop = _pSt->pBottom; //栈顶指向栈底
}
}
int main(int argc, char* argv[])
{
TSTACK St;
int iVal = 0;
int i = 0;
if(-1 == init(&St))
{
return -1;
}
while(i < 5)
{
printf("----Please input insert val to stack\n");
scanf("%d", &iVal);
push_stack(&St, iVal);
i++;
}
ergodic_stack(&St); //对栈进行遍历
pop_stack(&St);
ergodic_stack(&St); //删除栈顶元素后再次进行遍历
clear_stack(&St);
ergodic_stack(&St); //清空栈元素后再次进行遍历
return 0;
}
1 初始化栈
初始化栈时为栈顶和栈底指向同一个结点,即栈顶指向栈底
2 压栈
压栈即往栈里插入一个结点,因为栈里插入元素只能插入到栈顶,所以压栈的步骤是,
先创建一个新结点,然后把数据赋值到新结点数据域中,最后将栈顶指向新结点
3 遍历栈
因为栈时先进后出,所以栈顶元素先出来,栈底元素后出来。
先定义一个新结点指针,新结点指向栈顶元素,进入while循环判断,如果新结点不等于栈底,则输出数据域,再将新结点指向新结点的下一个结点,以此进行
循环判断
4 删除栈结点
因为删除栈结点时,必选从栈顶开始删除,所以删除一个栈元素,就是将栈顶元素删除,使栈顶指向下一个结点
本程序的步骤,1 初始化栈
2 往栈里插入五个结点,然后进行遍历输出,会输出5个结点的数据
3 删除一个栈元素,然后进行遍历输出,会输出4个节点的的数据
4 将栈进行清空,然后进行遍历输出,会提示栈为空
程序运行结果: