关于栈的创建以及基本操作(c语言)

最近在网上寻找了不少关于栈的知识,由此特来记录本人的一些心得。

栈和表一样,分为顺序栈和链栈,我们先来讲简单的顺序栈。

顺序栈其实和顺序表差别不大,以下是顺序栈的创建:

#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;
    }
    
    
}

以上就是顺序栈的简单运用了,顺序栈可以用在多种情况,后续的数据结构比如树的遍历,图等,都需要顺序栈的作用,但是顺序栈需要提前设置好大小,入栈的数据数量不能超过该大小,希望各位在使用顺序栈的时候能够记住这一点。

ac24f3a4473e4468bd6eca3b46e8f82c.jpg

 

接下来就是链栈了,链栈的优点在于灵活,其大小不用提前设置,可以根据数据大小来创建新的节点。

320cf5527c7e4c818b5f0fe40e4c5951.jpg

 

以下是链栈的创建:

#include
#include
typedef struct Listtack{
        int data;
        struct Listtack *next;
}Listtack,*ListTack;

学习过链表的同学看到这估计就会发现,链栈的创建和链表似乎没有什么两样,没错,链表和链栈的创建的确没有什么不一样,只是他们的操作有一点点不一样,接下来希望大家能够好好体会一下。

fa5f79db4f0b4939b99fe84693ac8b85.jpg

 

以下是链栈的初始化:

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);
}

而链栈的取栈顶操作和出栈操作一样,修改主函数里的条件就行了.

链栈的主函数操作和顺序栈的类似,只有些许需要修改一下,所以就不再赘述了。

以上就是栈的创建以及基本操作,谢谢大家。

 

你可能感兴趣的:(c语言,数据结构,struts)