最近在网上寻找了不少关于栈的知识,由此特来记录本人的一些心得。
栈和表一样,分为顺序栈和链栈,我们先来讲简单的顺序栈。
顺序栈其实和顺序表差别不大,以下是顺序栈的创建:
#include
#include
#define max 100
typedef struct Tack{
int *data;
int top;
}Tack;
创建好后就得初始化;
void inTack(Tack *s)
{
s->data=(int *)malloc(sizeof(max));
s->top=-1;//此处设top为-1是因为栈还没有数据
}
之后就是压栈
void push(Tack *s,int e)
{
s->data[++s->top]=e;
}
压栈之后就是出栈,出栈和压栈一样简单,代码如下:
void pop(Tack *s,int *e)
{
if(s->top==-1) return;
e=s->data[s->top];
s->top--;
}
而取栈顶就和出栈类似,就不写了,接下来是主函数里面怎么引用:
int main()
{
Tack s;
int e,t,choose=-1;
inTack(&s);
printf("1.入栈\t2.出栈\t3.取栈顶\t0.退出");
printf("请输入你的操作:");
while(choose !=0)
{
scanf("%d",&choose);
switch(choose)
{
case 1:{
printf("请输入你想入栈的元素:");
scanf("%d",&e);
push(&s,e);
break;
}
case 2:{
if(s->top==-1)
{
printf("栈内无元素!!!");
break;
}
while(s->top!=-1)
{
pop(&s,&t);
printf("%d",t);
}
break;
}
case 3:{
if(s->top==-1)
{
printf("栈内无元素!!!");
break;
}
pop(&s,&t);
printf("%d",t);
}
}
return 0;
}
}
以上就是顺序栈的简单运用了,顺序栈可以用在多种情况,后续的数据结构比如树的遍历,图等,都需要顺序栈的作用,但是顺序栈需要提前设置好大小,入栈的数据数量不能超过该大小,希望各位在使用顺序栈的时候能够记住这一点。
接下来就是链栈了,链栈的优点在于灵活,其大小不用提前设置,可以根据数据大小来创建新的节点。
以下是链栈的创建:
#include
#include
typedef struct Listtack{
int data;
struct Listtack *next;
}Listtack,*ListTack;
学习过链表的同学看到这估计就会发现,链栈的创建和链表似乎没有什么两样,没错,链表和链栈的创建的确没有什么不一样,只是他们的操作有一点点不一样,接下来希望大家能够好好体会一下。
以下是链栈的初始化:
void intlisttack(ListTack s)
{
s->next=NULL;
}
看到这的同学就会发现,链栈的初始化和链表的不同了吧,因为链栈的特性是先进后出,所以它的指针域应该反过来指。
接下来是链栈的压栈操作:
void push(ListTack s,int e)
{
ListTack t;
t=(Listtack *)malloc(sizeof(Listtack));
t->data=e;
t->next=s;
s=t;
}
以及出栈操作:
void pop(ListTack s,int *e)
{
ListTack b;
b=s;
e=s->data;
s=s->next;
free(b);
}
而链栈的取栈顶操作和出栈操作一样,修改主函数里的条件就行了.
链栈的主函数操作和顺序栈的类似,只有些许需要修改一下,所以就不再赘述了。
以上就是栈的创建以及基本操作,谢谢大家。