您的位置:首页 > 理论基础 > 数据结构算法

数据结构 创建栈 压栈 删除栈顶元素 清空栈 遍历栈 例子

2017-09-20 21:16 309 查看
本例子讲述了如何创建一个栈,压栈即往栈里插入一个结点,删除栈顶元素,以及对栈里的结点进行清空,遍历栈里的结点

#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

4000
{
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 将栈进行清空,然后进行遍历输出,会提示栈为空

程序运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐