/ c++ 实现///
坑 遍历栈链时不能用指针 不然top 指针指向栈底了。当 pop 出栈时把栈底都free 掉了导致内存泄漏
待优化
#include<iostream>
using namespace std;
//声明结点指针
typedef struct StackNode* pLinkStackNode;
//声明链栈指针
typedef struct Stack* pLinkStack;
//声明栈结点
typedef struct StackNode
{
//数据域
int Num;
//指针域
pLinkStackNode privor;
}LinkStackNode;
//声明链栈
typedef struct Stack
{
//链栈的长度
int length;
//栈顶
pLinkStackNode top;
//栈底
pLinkStackNode down;
}LinkStack;
//创建结点
pLinkStackNode Create_stack_node(int num)
{
pLinkStackNode p=(pLinkStackNode)malloc(sizeof(StackNode));
p->Num=num;
p->privor=NULL;
return p;
}
//创建链栈
LinkStack Create_link_stack(int num)
{
pLinkStackNode downStackNode=NULL,topStackNode=NULL;
//第一个结点栈底
downStackNode = Create_stack_node(0);
topStackNode = downStackNode;
for (int i =1; i<num; i++) {
pLinkStackNode p = Create_stack_node(i);
p->privor = topStackNode;
topStackNode = p;
}
LinkStack linkstack;
linkstack.length = num;
linkstack.down = downStackNode;
linkstack.top = topStackNode;
return linkstack;
}
//出栈
pLinkStack Pop_link_stack(pLinkStack ps)
{
pLinkStackNode LinkStackNodetop = ps->top;//把要出栈的原来顶点赋给临时量变
ps->top = ps->top->privor;//把原来顶点的上一个结点给栈链的顶点做为新顶点
ps->length--;//长度--
free(LinkStackNodetop);//删除原来的顶点
LinkStackNodetop=NULL;
return ps;
}
//入栈
pLinkStack Push_link_stack(pLinkStack ps,int num)
{
pLinkStackNode LinkStackNodetop = Create_stack_node(num);//创建一个新的顶点
LinkStackNodetop->privor =ps->top;
ps->top =LinkStackNodetop;
ps->length++;
// oldtop = ps->top;
// cout<<"<"<<ps->top->Num<<endl;
// ps->top = LinkStackNodetop;
// cout<<ps->top->Num<<endl;
//
cout<<ps->top->privor->Num<<endl;
// ps->top->privor = oldtop;//把原来顶点的上一个结点给栈链的顶点做为新顶点
// ps->length++;//长度++
return ps;
}
//打印栈链 遇到的问题有不能用指针不然它改变了指向 top 指向栈底 所以当你 pop 时把当前指针也删除了也就整个栈链内存泄漏
//void Printf_link_stack(pLinkStack ps)
//{
// pLinkStack p =ps;
// while (p->top->privor!=NULL) {
// cout<<p->top->Num<<endl;
// p->top=p->top->privor;
// }
// if (p->top->privor==NULL) {
// cout<<p->top->Num<<endl;
// }
//}
//只能用临时变量
void Printf_link_stack(pLinkStack ps)
{
//临时top变量
LinkStackNode p =*(ps->top);
//p.privor还是一个指针 但是这里循环就不能解引用,因为解引用是一个结构体了。类型不匹配。
while (p.privor!=NULL) {
cout<<p.Num<<endl;
p=*(p.privor);
}
// while (*(p.privor)!=NULL) {
// cout<<p.Num<<endl;
// p=*(p.privor);
// }
if (p.privor==NULL) {
cout<<p.Num<<endl;
}
}
int main()
{
LinkStack ps = Create_link_stack(10);
pLinkStack pl = &ps;
Printf_link_stack(pl);
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,13));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,12));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,5));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,16));
return 0;
}
///用模版实现//
链栈
#include<iostream>
using namespace std;
//声明结点指针
//声明栈结点
template<class T>
struct LinkStackNode
{
//数据域
T Num;
//指针域
LinkStackNode<T>* privor;
};
//声明链栈
template<class T>
struct LinkStack
{
//链栈的长度
int length;
//栈顶
LinkStackNode<T>* top;
//栈底
LinkStackNode<T>* down;
};
//创建结点
template<class T>
LinkStackNode<T>* Create_stack_node(T num)
{
LinkStackNode<T>* p=(LinkStackNode<T> *)malloc(sizeof(LinkStackNode<T>));
p->Num=num;
p->privor=NULL;
return p;
}
//创建链栈
template<class T>
LinkStack<T> Create_link_stack(int n,T num)
{
LinkStackNode<T>* downStackNode;
LinkStackNode<T>*topStackNode;
//第一个结点栈底
downStackNode = Create_stack_node(num);
topStackNode=downStackNode;
for (int i =1; i<n; i++) {
LinkStackNode<T>* p = Create_stack_node(num);
p->privor = topStackNode;
topStackNode = p;
}
LinkStack<T> linkstack;
linkstack.length = num;
linkstack.down = downStackNode;
linkstack.top = topStackNode;
return linkstack;
}
//出栈
template<class T>
LinkStack<T>* Pop_link_stack(LinkStack<T>* ps)
{
LinkStackNode<T>* LinkStackNodetop = ps->top;//把要出栈的原来顶点赋给临时量变
ps->top = ps->top->privor;//把原来顶点的上一个结点给栈链的顶点做为新顶点
ps->length--;//长度--
free(LinkStackNodetop);//删除原来的顶点
LinkStackNodetop=NULL;
return ps;
}
//入栈
template<class T>
LinkStack<T>* Push_link_stack(LinkStack<T>* ps,T num)
{
LinkStackNode<T>* LinkStackNodetop = Create_stack_node(num);//创建一个新的顶点
LinkStackNodetop->privor =ps->top;
ps->top =LinkStackNodetop;
ps->length++;
return ps;
}
//打印栈链
template<class T>
void Printf_link_stack(LinkStack<T>* ps)
{
//临时top变量
LinkStackNode<T> p =*(ps->top);
while (p.privor!=NULL) {
cout<<p.Num<<endl;
p=*(p.privor);
}
if (p.privor==NULL) {
cout<<p.Num<<endl;
}
}
int main()
{
LinkStack<double> ps = Create_link_stack(10,2.2);
LinkStack<double>* pl = &ps;
Printf_link_stack(pl);
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,2.2));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,3.4));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,4.5));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl,3.4));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
LinkStack<char> ps1 = Create_link_stack(10,'a');
LinkStack<char>* pl1 = &ps1;
Printf_link_stack(pl);
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl1,'e'));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl1));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl1));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl1));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Pop_link_stack(pl1));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl1,'r'));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl1,'q'));
cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
Printf_link_stack(Push_link_stack(pl1,'w'));
return 0;
}