疑惑
为什么栈要分两个结构体来创建,而链表只需要一个?
能不能只用一个结构体创建一个栈?
代码
用函数实现了压栈
,弹栈
,打印栈
的操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct tag//定义一个节点
{
int val;//这个节点的value
struct tag *pnext;//指向下一个节点的指针
}node, *pnode;
typedef struct//定义一整个栈
{
pnode phead;//这个栈的栈顶指针,指向一个节点(这个栈顶指针也可以在main函数里用*pnode phead定义,用&phead传参吧?)
int size;//这个栈的大小
}stack, *pstack;
void push_stack(pstack p, int val)//p是一个栈
{
pnode pnew = (pnode)calloc(1, sizeof(node));//pnew是新节点
pnew->val = val;//把想要入栈的值放进新节点pnew的val成员
if (NULL == p->phead)//如果链表为空(头插法)
{
p->phead = pnew;//让p栈的栈顶指针指向pnew节点,也就是把新节点pnew放进p栈
p->size++;
}
else//如果链表非空
{
pnew->pnext = p->phead;//让pnew节点的pnext指针指向原来的栈顶节点
p->phead = pnew;//让p栈的栈顶指针指向pnew节点
p->size++;
}
printf("入栈成功\n");
}
//打印
void print_stack(pstack p)
{
pnode pcur;
pcur = p->phead;
printf("输出:\n");
while (pcur != NULL)
{
printf("%d ", pcur->val);
pcur = pcur->pnext;//pcur指向下一个节点
}
printf("\n\n");
}
//弹栈
int pop_stack(pstack p)//p栈
{
int val;
pnode pcur;//pcur指向一个节点,暂存phead,用来free
if (NULL == p->phead)//如果栈为空
{
printf("弹栈失败,因为栈为空...\n");
return 0;
}
else//如果栈非空
{
pcur = p->phead;
val = pcur->val;
p->phead = pcur->pnext;//头指针指向下一个节点
free(pcur);
printf("弹栈成功\n"); if (NULL == p->phead)printf("栈空了...\n");
return val;
}
return 0;
}
int main()
{
stack s;
int val;
memset(&s, 0, sizeof(s));
push_stack(&s, 5);
push_stack(&s, 6);
push_stack(&s, 7);
push_stack(&s, 8);
push_stack(&s, 9);
print_stack(&s);
val = pop_stack(&s);//1
printf("弹出的数为:%d\n", val);
print_stack(&s);
val = pop_stack(&s);//2
printf("弹出的数为:%d\n", val);
print_stack(&s);
val = pop_stack(&s);//3
printf("弹出的数为:%d\n", val);
print_stack(&s);
val = pop_stack(&s);//4
printf("弹出的数为:%d\n", val);
print_stack(&s);
val = pop_stack(&s);//5
printf("弹出的数为:%d\n", val);
print_stack(&s);
val = pop_stack(&s);//6
printf("弹出的数为:%d\n", val);
print_stack(&s);
system("pause");
}