用一段代码表示栈的基本操作
这里栈原理的实现需要线性表中节点的概念,所以如果对栈的理解有问题,可以先学习一下线性表的知识。这里用到了结构体的知识,可以实现栈的初始化、栈的遍历、push函数、pop函数、查看栈是否为空以及栈的清空等操作。
#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
//这里的结构体是栈里面的东西 ,分别表示数据域和下一个数据
typedef struct node
{
int member;
struct node* pNext;
}Node,*pNode;
//这是结构体的外壳 ,分别表示栈顶和栈底
typedef struct stack
{
pNode Top;
pNode Bottom;
}Stack,*pStack;
void InitStack(pStack);
bool Push(pStack,int);
void TraverseStack(pStack);
bool Empty(pStack);
int Pop(pStack);
void Clear(pStack);
//进行栈的初始化
void InitStack(pStack ps)
{
ps->Top = new Node;
ps->Bottom = ps->Top;
ps->Top->pNext = NULL;
return;
}
bool Push(pStack ps,int data)
{
pNode pNew = new Node;
if(NULL == pNew)
{
return false;
}
//把要进栈的数据赋给新节点的member成员
pNew->member = data;
//使新节点的指针指向栈顶
pNew->pNext = ps->Top;
//把新节点作为新栈顶
ps->Top = pNew;
return true;
}
//进行栈的遍历
void TraverseStack(pStack ps)
{
pNode pNew = ps->Top;
while(pNew != ps->Bottom)
{
cout << pNew->member;
pNew = pNew->pNext;
}
return;
}
//判断栈是否为空
bool Empty(pStack ps)
{
if(ps->Top == ps->Bottom)
{
return true;
}
else
{
return false;
}
}
//进行出栈操作
int Pop(pStack ps)
{
pNode pSwap = NULL;
int return_val;
//用于返回栈顶元素
return_val = ps->Top->member;
pSwap = ps->Top;
//使栈顶指向栈顶的下一个节点
ps->Top = ps->Top->pNext;
//释放以前的栈顶空间b
//free(pSwap);
return return_val;
}
void Clear(pStack ps)
{
pNode pNew = NULL;
//栈底和栈顶不等,循环
while(ps->Top != ps->Bottom)
{
//使一个新的节点和栈顶指向同一空间
pNew = ps->Top;
//使栈顶指向栈顶的下一个节点
ps->Top = ps->Top->pNext;
//释放掉以前的栈顶空间
free(pNew);
}
return;
}
int main(void)
{
//定义一个栈
Stack s;
int i;
int num;
//临时保存用户输入的数据
int data;
//保存Pop函数的返回值
int re_num;
InitStack(&s);
cout << "你想输入几个数据:";
cin >> num;
for(i = 0;i < num;i++)
{
cout << "第" << i+1 << "个数字:";
cin >> data;
//调用Push函数
if(Push(&s,data))
{
continue;
}
else
{
cout << "进行栈操作失败" << endl;
exit(-1);
}
}
//调用遍历函数
TraverseStack(&s);
cout << "想要删除几个数字:";
cin >> data;
cout << "你去掉的数字是:";
for(i = 0;i < data;i++)
{
//调用Pop函数,并把返回值赋给re_num
re_num = Pop(&s);
cout << re_num;
}
cout << "删除后的剩余数据是:";
TraverseStack(&s);
cout << endl;
//调用清空栈函数
Clear(&s);
cout << "栈是否清空" << endl;
TraverseStack(&s);
cout << endl;
return 0;
}