linux学习总结(数据结构——栈和队列)

学习的捷径:多写代码

栈:栈是限制在一端进行插入操作和删除操作的线性表,额,又是线性表,那就是说又可以有两种存储方式:顺序栈,链式栈。允许进行操作的一端称为“栈顶”,另一端称为“栈底”。特点:先进先出。

所谓的栈和队列,其实是一种技术,有时候需要特殊的存储方式,然后在必要的时候还原该元素,就会利用到栈或者队列,例如在ARM操作的一些裸机代码中,需要保持状态寄存器中的值,根据需要可以利用栈或者队列来存储,用起来很方便安全,所以在涉及到存储数据之类的操作时候,要想到这两个技术。

基本运算:

  创建空栈:createstack();判断是否空栈 isempty(S);判断满栈isfull(S);进栈:push(S,x);出栈pop(S);

同样,再一次熟悉一下顺序存储和链式存储

顺序栈:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#define N 10
typedef int datatype;

typedef struct {

    datatype data[N];
    int top;
}sqstack;
sqstack * create()
{
    sqstack * s;
    bzero(&s,sizeof(s));
    if((s = (sqstack *)malloc(sizeof(sqstack)))==NULL)
    {
        perror("malloc");
        exit(-1);
    }
    s->top = -1;
    return s;
}
int isempty(sqstack *s)
{
    if(s->top == -1)
    return 0;
    return -1;
}
int isfull(sqstack *s)
{
    if(s->top == N-1)
        return 0;
    return -1;
}
int push(sqstack *s,datatype data)
{
    if(isfull(s)==0)
    {
        printf("stack is full\n");
        return -1;
    }
    s->top++;
    s->data[s->top] = data;
    return 0;
}
datatype pop(sqstack *s)
{
    datatype data;
    if(isempty(s)==0)
    {
        printf("the sqstack is empty!");
        return ;
    }
    data = s->data[s->top];
    s->top--;
    return data;
}
void show(sqstack *s)
{
    int i;
    i = s->top;
    if(isempty(s)==0)
    {
        printf("empty!");
        return ;
    }
    printf("data = %d\n",s->data[i]);
    
}
int main(int argc,char * argv[])
{
    int i,ret;
    sqstack * s;
    s = create();
    for(i = 1;i< 12;i++)
    {
        ret = push(s,i);
        if(ret != 0 )
            return -1;
        show(s);
    }
     free(s);
    return 0;
}

 

链式栈:

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node{
    datatype data;
    struct node * next;
}linknode,*linkstack;

linkstack create()
{
    linkstack h;
    if((h = (linkstack)malloc(sizeof(linknode)))==NULL)
    {
        perror("malloc");
        return NULL;
    }
    h->next = NULL;
    return h;
}
int push(linkstack h,datatype data)
{
    linkstack p;
    if((p = (linkstack)malloc(sizeof(linknode)))==NULL)
    {
        perror("malloc");
        return -1;
    }
    p->data = data;
    p->next = h->next;
    h->next = p;
    return 0;
}
int isempty(linkstack h)
{
    if(h->next==NULL)
    {
        printf("is empty\n");
        return 1;
    }
    return 0;

}
datatype pop(linkstack h)
{
    datatype data;
    linkstack p = NULL;
    if(isempty(h))
    {
        return 0;
    }
    p = h->next;
    h->next = p->next;
    data = p->data;
    free(p);
    return data;
    
}
void show(linkstack h)
{
    linkstack p = NULL;
    if(isempty(h))
    {
        printf("is empty!\n");
        return ;
    }
    p = h->next;
    while(p != NULL)
    {
        printf("data = %d\n",p->data);
        p = p->next;
    }

}
int main(int argc,char * argv[])
{
    int i;
    linkstack h;
    h = create();
    for(i = 1;i < 10;i++)
    {
        push(h,i);
    }
    show(h);
    return 0;
}


比较简单的操作。接下来就是队列了,一般用的循环队列。一个有趣的程序叫做球钟。

下次实现。

posted on 2012-06-13 21:10  孟浩依然  阅读(1240)  评论(0编辑  收藏  举报