现在的位置: 首页 > 综合 > 正文

链式栈

2013年01月17日 ⁄ 综合 ⁄ 共 1739字 ⁄ 字号 评论关闭

链式栈

#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);
}

 

抱歉!评论已关闭.