// 栈.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "malloc.h"
typedef struct LinkNode //链式栈结点
{
int data;
struct LinkNode* next;
}LinkNode;
typedef struct //链式栈
{
LinkNode * top;
}LiStack;
void InitStack(LiStack &S)
{//
S.top=(LinkNode*)malloc(sizeof(LinkNode));//建立top 头结点
S.top->next=NULL;
S.top->data=0;
}
bool StackEmpty(LiStack S)
{
if (S.top->next==NULL)
return true; //空
else
return false;
}
void Push(LiStack &S,LinkNode* &p)
{//每次都是在top头结点后入栈
//p=(LinkNode*)malloc(sizeof(LinkNode));
p->next=S.top->next;
S.top->next=p;
}
bool Pop(LiStack &S,LinkNode* &p)
{
if (S.top->next==NULL)
return false;
p=S.top->next;
S.top->next=p->next;
return true;
};
bool GetTop(LiStack S,LinkNode* &p)
{
if (StackEmpty(S))
return false;
p=(BiTNode*)malloc(sizeof(BiTNode));
memcpy(p,S.top,sizeof(BiTNode));
return true;
}
void ClearStack(LiStack &S)//销毁栈
{//保留top头结点,恢复到Init状态
LinkNode* p;
p=S.top->next;
while(p)
{
S.top->next=p->next;
free(p);
p=S.top->next;
}
}
void DispStack(LiStack S)
{//从栈底元素开始显示
if(StackEmpty(S))
return ;
LinkNode* p=S.top->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
LiStack S;
InitStack(S);
LinkNode* p;
for(int i=1;i<=10;i++)
{
p=(LinkNode*)malloc(sizeof(LinkNode));
p->data=i;
Push(S,p);
}
DispStack(S);
//ClearStack(S);
Pop(S,p);
Pop(S,p);
Pop(S,p);
Pop(S,p);
DispStack(S);
return 0;
}