#include<iostream>//构建栈并且进行压栈出栈操作
using namespace std;
typedef struct Node//构建链表结点结构体类型
{
int data;//一个链表结点的关键参数1是数据域的数据,这个数据可以很复杂,这里以存放一个整数为例
struct Node* pNext;//一个链表结点的关键参数2是指针域,即存放下一个结点地址的指针变量
}NODE,*PNODE;//NODE是给struct Node结构体类型起一个短一点的类型名字,即NODE等价于struct Node,*PNODE等价于struct Node*
typedef struct Stack//构建栈结构体类型
{
PNODE pTop;//栈的关键参数1是栈顶结点地址,即需要一个节点类型的指针指向栈顶结点
PNODE pBottom;//栈的关键参数2是栈底部的头结点
}STACK, * PSTACK;
void init(PSTACK pStack)//对栈进行初始化
{
PNODE p = (PNODE)malloc(sizeof(NODE));//产生一个结点作为不存放有效数据的头结点,目的是为了方便操作链表,即方便操作栈结点
pStack->pBottom = p;//动态分配的结点内存地址赋给头指针
pStack->pTop = p;//动态分配的结点内存地址赋给栈顶结点指针
pStack->pTop->pNext = NULL;//栈顶结点的指针域初始化为NULL,因为不知道它指向哪个结点
}
void push(PSTACK pStack, int val)//压栈
{
PNODE p = (PNODE)malloc(sizeof(NODE));//动态分配一个结点内存
if (p == NULL)//动态内存分配失败
{
cout << "动态内存分配失败" << endl;
exit(-1);//直接终止程序
}
p->data = val;//将压入栈的变量值给新节点的数据域
p->pNext = pStack->pTop;//新结点的指针域存放的是栈顶结点的地址
pStack->pTop = p;//新节点的地址就是栈顶结点的地址
}
bool is_emp(PSTACK pStack)//判断栈是否为空栈
{
if (pStack->pTop == pStack->pBottom)//当指向栈顶和栈底的指针相等时,就是空栈
return true;
else
return false;
}
void traverse(PSTACK pStack)//遍历栈元素
{
PNODE p= pStack->pTop;
while (pStack->pBottom != p)
{
cout << p->data<<" " ;
p = p->pNext;
}
}
bool pop(PSTACK pStack, int* val)//出栈
{
if (is_emp(pStack))//如果为空栈,就无元素可出栈
{
return false;
}
else
{
*val = pStack->pTop->data;//首先把出栈的结点数据保存
PNODE r = pStack->pTop;//把要出栈的节点地址保存
pStack->pTop = pStack->pTop->pNext;//栈顶结点指针下移
free(r);//释放出栈结点的内存
r = NULL;
return true;
}
}
void clear(PSTACK pStack)//释放栈内存,而不是仅让栈结点的数据域无效
{
if (is_emp(pStack))
return;
else
{
while (pStack->pTop != pStack->pBottom)
{
PNODE r = pStack->pTop;
pStack->pTop = pStack->pTop->pNext;
free(r);
r = NULL;
}
pStack->pTop = pStack->pBottom;
//cout << "hahaha";
}
}
int main()//测试
{
int val;
PSTACK pst=(PSTACK)malloc(sizeof(STACK));//指向一个栈
init(pst);
push(pst, 1);
push(pst, 2);
push(pst, 3);
push(pst, 4);
push(pst, 5);
push(pst, 6);
traverse(pst);
for (int i = 0;i < 6;i++)
{
if (pop(pst, &val))
{
cout << "出栈的元素是:" << val << endl;
}
else
cout << "出栈失败" << endl;
}
clear(pst);
traverse(pst);
}
利用链表创建一个动态栈,并进行初始化、压栈、出栈、清空、判断是否为空栈的操作。
最新推荐文章于 2022-06-28 20:00:01 发布