队列、栈(数据结构)

介绍

  • 队列是一种先进先出(First In First Out)的线性表,只允许在线性表的一端进行插入操作,在另一端进行删除操作。允许插入的一端称为队尾,允许删除的一端称为队头。可以将队列想象成一个管道,数据从一边进入,从另一边流出。所以有时候队列也称为管道(pipe)。
  • 栈是一种只能后进先出(Last In First Out)的数据结构,表现为只能在线性表的尾部进行插入和删除操作。其中,把数据插入栈称为压栈(Push),把数据从栈中取出来称为弹栈(Pop)。

队列

/*************************************************************************
    > File Name: arrQueue.c
    > Author: mrhjlong
    > Mail: mrhjlong@163.com 
    > Created Time: 2016年04月24日 星期日 14时58分21秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE        100
#define QUEUE_FULL     1
#define QUEUE_NOT_FULL 0
#define ERROR          -1
#define OK             2

typedef int type_t;

typedef struct
{
    type_t data[MAXSIZE];
    int writePtr;
    int readPtr;
    int flag;
}Queue;

//创建队列
Queue *queue_create()
{
    Queue *q = (Queue *)malloc(sizeof(Queue));
    q->writePtr = 0;
    q->readPtr = 0;
    q->flag = QUEUE_NOT_FULL;
    return q;
}

//销毁队列
void queue_destroy(Queue *q)
{
    if(q != NULL)
        free(q);
}

//入队
int enQueue(Queue *q, type_t data)
{
    if(q->flag == QUEUE_FULL)
        return ERROR;
    else
    {
        q->data[q->writePtr] = data;
        q->writePtr = (q->writePtr + 1) % MAXSIZE;

        if(q->writePtr == q->readPtr)
            q->flag = QUEUE_FULL;

        return OK;
    }
}

//出队
int deQueue(Queue *q, type_t *pData)
{
    if(q->writePtr == q->readPtr && q->flag == QUEUE_NOT_FULL)
        return ERROR;
    else
    {
        *pData = q->data[q->readPtr];
        q->readPtr = (q->readPtr + 1) % MAXSIZE;

        if(q->flag == QUEUE_FULL)
            q->flag = QUEUE_NOT_FULL;

        return OK;
    }
}

//获取队列长度
int queueLength(Queue *q)
{
    if(q->writePtr > q->readPtr)
        return q->writePtr - q->readPtr;
    else if(q->writePtr < q->readPtr)
        return MAXSIZE + q->readPtr - q->writePtr;
    else 
    {
        if(q->flag == QUEUE_FULL)
            return MAXSIZE;
        else
            return 0;
    }
}


int main()
{
    int i = 0;
    int temp = 0;

    Queue *q = queue_create();

    for(i = 0; i < 10; i++)
        enQueue(q, i);

    printf("length : %d\n", queueLength(q));

    for(i = 0; i < 10; i++)
    {
        deQueue(q, &temp);
        printf("dequeue : %d\n", temp);
    }

    printf("length : %d\n", queueLength(q));

    queue_destroy(q);

    return 0;
}

栈(顺序存储1)

/*************************************************************************
    > File Name: arrStack.c
    > Author: mrhjlong
    > Mail: mrhjlong@163.com 
    > Created Time: 20160424日 星期日 100633************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 100
#define ERROR   -1
#define OK      0

typedef int type_t;

typedef struct
{
    type_t data[MAXSIZE];
    int index;
}Stack;

//创建
Stack *stack_create()
{
    Stack *s = (Stack *)malloc(sizeof(Stack));
    s->index = 0;
    return s;
}

//销毁
void stack_destroy(Stack *s)
{
    if(s != NULL)
        free(s);
    return;
}

//压栈
int push(Stack *s, type_t data)
{
    if(s->index == MAXSIZE)
        return ERROR;
    else
    {
        s->data[s->index] = data;
        s->index++;
        return OK;
    }
}

int pop(Stack *s, type_t *pData)
{
    if(s->index == 0)
    {
        return ERROR;
    }
    else
    {
        s->index--;
        *pData = s->data[s->index];
        return OK;
    }
}

void stack_print(Stack *s)
{
    type_t i;
    for(i = 0; i < s->index; i++)
        printf("%d ", s->data[i]);
    printf("\n");
}

//获取栈的顶端元素
int get_head(Stack *s)
{
    if(s != NULL)
        return s->data[s->index - 1];
}

//栈顶减一
void pop_null(Stack *s)
{
    if(s != NULL)
        s->index--;
}

//打印栈的大小
int stack_size(Stack *s)
{
    if(s != NULL)
        return s->index;
}

int main()
{
    Stack *s = stack_create();
    type_t a[10] = {0};
    type_t i;
    char str[] = "931-3*+62/+";

    for(i = 0; i < 11; i++)
    {
        if(push(s, i) == OK)
            stack_print(s);
        else
            printf("ERROR!\n");
    }
    pop(s, a);
    pop(s, a + 1);
    pop(s, a + 2);

    for(i = 0; i < 3; i++)
        printf("%d ", a[i]);
    printf("\n");
    stack_print(s);

    return 0;
}

栈(顺序存储2)

/*************************************************************************
    > File Name: arrStack.c
    > Author: mrhjlong
    > Mail: mrhjlong@163.com 
    > Created Time: 20160424日 星期日 100633************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ERROR -1
#define OK    0

typedef int type_t;

typedef struct
{
    type_t *data;
    int index;
    int size;
}Stack;

//创建
Stack *stack_create(int size)
{
    Stack *s = (Stack *)malloc(sizeof(Stack));
    s->data = (type_t *)malloc(size * sizeof(type_t));
    s->index = 0;
    s->size = size;
    return s;
}

//销毁
void stack_destroy(Stack *s)
{
    if(s != NULL)
    {
        free(s->data);
        free(s);
    }
    return;
}

//压栈
int push(Stack *s, type_t data)
{
    if(s->index == s->size)
        return ERROR;
    else
    {
        s->data[s->index] = data;
        s->index++;
        return OK;
    }
}

int pop(Stack *s, type_t *pData)
{
    if(s->index == 0)
    {
        return ERROR;
    }
    else
    {
        s->index--;
        *pData = s->data[s->index];
        return OK;
    }
}

void stack_print(Stack *s)
{
    type_t i;
    for(i = 0; i < s->index; i++)
        printf("%d ", s->data[i]);
    printf("\n");
}

//获取栈的顶端元素
int get_Head(Stack *s)
{
    if(s != NULL)
        return s->data[s->index - 1];
}

//栈顶减一
void pop_null(Stack *s)
{
    if(s != NULL)
        s->index--;
}

//打印栈的大小
int stack_size(Stack *s)
{
    if(s != NULL)
        return s->index;
}

const char *str = "((unsigned long)&(((type_t*)0)->member))";

int check(const char *str)
{
    Stack *s = stack_create(10);
    int len = strlen(str);
    int i;
    for(i = 0; i < len; i++)
    {
        if(s->index < 0)
        {
            stack_destroy(s);
            return ERROR;
        }
        if(str[i] == '(')
        {
            push(s, 1);
        }
        if(str[i] == ')')
        {
            pop_null(s);
        }
    }
    stack_destroy(s);

    if(s->index == 0)
        return OK;
    else
        return ERROR;
}

int main()
{
    Stack *s = stack_create(10);
    type_t a[10] = {0};
    type_t i;

    for(i = 0; i < 11; i++)
    {
        if(push(s, i) == OK)
            stack_print(s);
        else
            printf("ERROR!\n");
    }
    pop(s, a);
    pop(s, a + 1);
    pop(s, a + 2);

    for(i = 0; i < 3; i++)
        printf("%d ", a[i]);
    printf("\n");

    stack_print(s);
    printf("\n");

    if(check(str) == OK)
        printf("OK!\n");
    else
        printf("ERROR!\n");

    return 0;
}

栈(链式存储)

/*************************************************************************
    > File Name: listStack.c
    > Author: mrhjlong
    > Mail: mrhjlong@163.com 
    > Created Time: 20160424日 星期日 100633************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 10
#define ERROR -1
#define OK 0

typedef int type_t;

typedef struct node
{
    type_t data;
    struct node *next;
}QNode;


typedef struct
{
    QNode *head;
    int index;
}Stack;

//创建
Stack *stack_create()
{
    Stack *s = (Stack *)malloc(sizeof(Stack));
    s->head = NULL;
    s->index = 0;
    return s;
}

//销毁
void stack_destroy(Stack *s)
{
    if(s != NULL)
        free(s);
    return;
}

//压栈
int push(Stack *s, type_t data)
{
    //链表头插法
    QNode *pNode = (QNode *)malloc(sizeof(QNode));

}

int pop(Stack *s, type_t *pData)
{
    //删除节点
    if(s->index == 0)
    {
        return ERROR;
    }
    else
    {
        s->index--;
        *pData = s->data[s->index];
        return OK;
    }
}

void stack_print(Stack *s)
{
    type_t i;
    for(i = 0; i < s->index; i++)
        printf("%d ", s->data[i]);
    printf("\n");
}

//获取栈的顶端元素
int get_Head(Stack *s)
{
    if(s != NULL)
        return s->data[s->index - 1];
}

//栈顶减一
void pop_null(Stack *s)
{
    if(s != NULL)
        s->index--;
}

//打印栈的大小
int stack_size(Stack *s)
{
    if(s != NULL)
        return s->index;
}

int main()
{
    Stack *s = stack_create();
    type_t a[10] = {0};
    type_t i;

    for(i = 0; i < 11; i++)
    {
        if(push(s, i) == OK)
            stack_print(s);
        else
            printf("ERROR!\n");
    }
    pop(s, a);
    pop(s, a + 1);
    pop(s, a + 2);

    for(i = 0; i < 3; i++)
        printf("%d ", a[i]);
    printf("\n");
    stack_print(s);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值