运行截图:
链栈lst的几个要素:
1)栈空条件:lst->next==NULL
2) 栈满条件 :通常不存在
3)元素入栈:p 为申请的节点,p->data=x;
p->next=lst->next;
lst->next=p;
注: p变为栈顶指针,指针指向是从上往下所以 p->next=lst->next;
4)元素出栈: p=lst->next;
x=p->data;
lst->next =p->next;
free§;
typedef struct linknode{
int data;
struct linknode *next;
}LinkStack;
//初始化栈的算法
void InitStack(LinkStack *&lst)
{
lst=(LinkStack*)malloc(sizeof(LinkStack));
lst->next=NULL;
}
//判断栈是否为空
int StackEmpty(LinkStack *lst)
{
return (lst->next==NULL);
}
//入栈操作
void Push(LinkStack *&lst,int &x)
{
LinkStack *p;
p=(LinkStack*)malloc(sizeof(LinkStack));
p->data=x;
p->next=lst->next;
lst->next=p;
}
//出栈操作
int Pop(LinkStack *&lst,int &x)
{
LinkStack *p;
if(lst->next==NULL)
return 0;
p=lst->next;
x=p->data;
lst->next=p->next;
free(p);
return 1;
}
//取栈顶元素
int Gop(LinkStack *&lst,int &x)
{
LinkStack *p;
if(lst->next==NULL)
return 0;
p=lst->next;
x=p->data;
return x;
}
//打印想入栈元素栈内元素
void printElement(LinkStack *lst)
{
int x;
printf("请输入要入栈的元素:\n");
for(int i=10;i>=1;i--) //从 1到10也行
{
scanf("%d",&x);
Push(lst,x);
printf("%d\t",lst->next->data);
lst=lst->next;
}
printf("\n");
}
// 求栈的长度
int length(LinkStack *lst)
{
int i=0;
while(lst->next!=NULL)
{
lst=lst->next;
i++;
}
return i;
}
int main()
{ int y,T;
LinkStack *LS;
InitStack(LS);
StackEmpty(LS);
printElement(LS);
printf("链栈的长度为:%d\n",length(LS));
printf("取得栈顶元素:%d\n",Gop(LS,T));
printf("将栈顶元素出栈\n");
Pop(LS,y);
printf("链栈的长度为:%d\n",length(LS));
for(int j=length(LS);j>=1;j--)
{
printf("%d\t",LS->next->data);
LS=LS->next;
}
return 0;
}