主要功能有:栈的初始化,栈的push,栈的pop,栈为空的判断,栈的清空,栈元素的打印
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int val;
struct Node* next;
}NODE,*PNODE;
typedef struct Stack
{
PNODE top;
PNODE bottom;
}STACK,*PSTACK;
void init(PSTACK ps)
{
ps->top=(PNODE) malloc(sizeof(NODE));
if(NULL==ps->top)
{
printf("内存分配失败");
}
else
{
ps->bottom=ps->top;//头部和尾部指向一致
ps->top->next=NULL;//头部或者尾部的next为空
}
}
void push(PSTACK ps,int val)
{
PNODE pnew=(PNODE) malloc(sizeof(NODE));
pnew->val=val;
pnew->next=ps->top;//让新插入的节点指向top节点
ps->top=pnew;//插入节点后top节点往上移,存放pnew地址,从而指向pnew
}
bool isempty(PSTACK ps)
{
if(ps->top==ps->bottom)//栈顶等于栈尾
{
return true;
}else
{
return false;
}
}
bool pop(PSTACK ps,int *val)
{
if(isempty(ps))
{
return false;
}
else
{
PNODE temp=ps->top;//临时节点存放刚开始top
*val=temp->val;//把临时节点值赋给*val,从而改变主函数val
ps->top=temp->next;//top指向临时节点的下一个节点
free(temp);//释放临时节点
temp=NULL;
return true;
}
}
void print(PSTACK ps)
{
PNODE p=ps->top;
while(p!=ps->bottom)//p不为栈尾,一直打印
{
printf("%d\n",p->val);
p=p->next;
}
}
void clear(PSTACK ps)
{
if(isempty(ps))
{
return;
}
PNODE p=ps->top;
PNODE q=NULL;
while(p!=ps->bottom)
{
q=p->next;//q一直为的下一个节点
free(p);//释放p
p=q;//p指向q
}
ps->top=ps->bottom;
}
int main()
{
STACK s;
int val;
init(&s);
push(&s,1);
push(&s,2);
push(&s,3);
push(&s,4);
print(&s);
if(pop(&s,&val))
{
printf("出栈成功,出栈元素是%d\n",val);
}
else
{
printf("出栈失败");
}
print(&s);
clear(&s);
print(&s);
}
效果: