链式栈
#include "iostream.h"
#include "malloc.h"
typedef int ElemType;
typedef int Status ;
//--------链式栈定义--------
typedef struct Stack
{
ElemType data;
struct Stack *next;
}Stack,*LinkStack;
Stack *p;
static int i=0;//--------
//---------------创建链表-----------------------
void CreateList_LS(LinkStack &LS,int n)
{
LS=(LinkStack)malloc(sizeof(Stack));
LS->next=NULL;
for(int i=1;i<=n;i++)
{
p=(LinkStack)malloc(sizeof(Stack));
cout<<"\n请输入第"<<i<<"个链式栈结点的值\t";
cin>>(p->data);
p->next=LS->next;
LS->next=p;
}
}
//---------链式栈中查找栈顶结点的值------------
Status GetTop(LinkStack &LS,ElemType &e)
{
if(LS->next==NULL)
{
cout<<"目前为空栈,无栈顶元素!"<<endl;
return 0;
}
e=LS->next->data;
cout<<"\n\n当前栈顶元素为"<<e<<endl;
return 1;
}
//向栈顶插入一个元素
Status Push(LinkStack &LS,ElemType e)
{
p=(LinkStack)malloc(sizeof(Stack));
p->data=e;
if(LS->next==NULL)
{
cout<<"尚未执行插入操作前为一个空栈!"<<endl;
}
else
{
p->next=LS->next;
LS->next=p;
}
return 1;
}
//删除栈顶元素
Status Pop(LinkStack &LS,ElemType &e)
{ i++;
if(LS->next==NULL)
{
cout<<"目前为空栈,无法执行删除栈顶元素的操作!"<<endl;
return 0;
}
else
{
e=LS->next->data;
LS->next=LS->next->next; //*(想想为什么不能写为 LS->next=p->next; )第一次执行删除操作时存在p,以后再进行删除操作时就可能不存在p了。
cout<<"\n刚才所删除的结点其值为"<<e<<endl;
if(i==1)
{ free(p); }//-----*********重要!!!***************------------
return 1;
}
}
//检测该链式栈是否完全正确,通过不断地删除栈顶元素和获取栈顶元素
void Check_RightOrNot(LinkStack &LS)
{
cout<<"\n以下为 快速验证链式栈是否完全正确 的操作\n"<<endl;
int ran;
while(LS->next!=NULL)
{
Pop(LS,ran);
GetTop(LS,ran);
}
}
void main()
{
cout<<"\n\t====================链式栈=================="<<endl;
int num;
cout<<"请输入初始时链式线性表中结点的个数"<<endl;
cin>>num;
LinkStack LS;
CreateList_LS(LS,num);
ElemType value;
GetTop(LS,value);
cout<<"\n请输入一个欲插入的"<<"链式栈结点的值\t";
cin>>value;
Push(LS,value);GetTop(LS,value);
Pop(LS,value);GetTop(LS,value);
Check_RightOrNot(LS);
}