赞
踩
目录
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈,出数据也在栈顶
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
stack.h头文件:
- #pragma once
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<assert.h>
- #include<stdbool.h>
-
- typedef int STDatatype;
- typedef struct Stack
- {
- STDatatype*a;
- int top;
- int capacity;
-
- }ST;
- //初始化栈
- void StackInit(ST*ps);
- //栈销毁
- void StackDestroy(ST*ps);
- //入栈
- void StackPush(ST*ps,STDatatype x);
- //出栈
- void StackPop(ST*ps);
- //获取栈顶元素
- STDatatype StackTop(ST*ps);
- //获取栈中有效个数
- int StackSize(ST*ps);
- //判断栈是否为空
- bool StackEmpty(ST*ps);
代码实现:
- #include"stack.h"
- //初始化栈
- void StackInit(ST*ps)
- {
- assert(ps);
- ps->a = NULL;
- ps->capacity = ps->top = 0;
- }
- //栈销毁
- void StackDestroy(ST*ps)
- {
- assert(ps);
- free(ps->a);
- ps->a = NULL;
- ps->capacity = ps->top = 0;
-
- }
- //入栈
- void StackPush(ST*ps, STDatatype x)
- {
- assert(ps);
- if (ps->capacity == ps->top)
- {
- int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
- STDatatype*new = realloc(ps->a,sizeof(STDatatype)*newcapacity);
- if (new == NULL)
- {
- printf("realloc fail");
- exit(-1);
- }
- ps->a = new;
- ps->capacity = newcapacity;
- }
- ps->a[ps->top] = x;
- ps->top++;
- }
- //出栈
- void StackPop(ST*ps)
- {
- assert(ps);
- assert(ps->top>0);
-
- ps->top--;
-
- }
- //获取栈顶元素
- STDatatype StackTop(ST*ps)
- {
- assert(ps);
- assert(ps->top>0);
- return ps->a[ps->top - 1];
- }
- //获取栈中有效数据个数
- int StackSize(ST*ps)
- {
- assert(ps);
- return ps->top ;
-
- }
- //判断栈是否为空
- bool StackEmpty(ST*ps)
- {
- //为空返ture 不为空返false
- assert(ps);
- return ps->top == 0;
- }
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 ,入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
Queue.h头文件:
- #pragma once
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<assert.h>
- #include<stdbool.h>
-
-
- typedef int QDataType;
- typedef struct QListNode
- {
- struct QListNode*next;
- QDataType data;
- }QListNode;
-
- typedef struct Queue
- {
- QListNode*head;
- QListNode*tail;
- }Queue;
-
- //初始化队列
- void QueueInit(Queue* q);
- // 队尾入队列
- void QueuePush(Queue* q, QDataType data);
- // 队头出队列
- void QueuePop(Queue* q);
- // 获取队列头部元素
- QDataType QueueFront(Queue* q);
- // 获取队列队尾元素
- QDataType QueueBack(Queue* q);
- // 获取队列中有效元素个数
- int QueueSize(Queue* q);
- // 检测队列是否为空,如果为空返回true,如果非空返回false
- bool QueueEmpty(Queue* q);
- // 销毁队列
- void QueueDestroy(Queue* q);
Queue.c:
- #include"Queue.h"
-
- //初始化队列
- void QueueInit(Queue* q)
- {
- assert(q);
- q->head = NULL;
- q->tail = NULL;
-
- }
- // 队尾入队列
- void QueuePush(Queue* q, QDataType x)
- {
- assert(q);
- QListNode*newcode = (QListNode*)malloc(sizeof(QListNode));
- newcode->data = x;
- newcode->next = NULL;
- if (q->head == NULL)
- q->head = q->tail = newcode;
- else
- {
- q->tail->next = newcode;
- q->tail = newcode;
- }
-
- }
- // 队头出队列
- void QueuePop(Queue* q)
- {
-
- assert(q);
- assert(!QueueEmpty(q));
- QListNode*next = q->head->next;
- free(q->head);
- q->head = next;
- if (q->head == NULL)
- q->tail = NULL;
- }
- // 获取队列头部元素
- QDataType QueueFront(Queue* q)
- {
-
- assert(q);
- assert(!QueueEmpty(q));
- return q->head->data;
-
- }
- // 获取队列队尾元素
- QDataType QueueBack(Queue* q)
- {
- assert(q);
- assert(!QueueEmpty(q));
- return q->tail->data;
- }
- // 获取队列中有效元素个数
- int QueueSize(Queue* q)
- {
- assert(q);
- int tmp = 0;
- QListNode*cur = q->head;
- while (cur)
- {
- ++tmp;
- cur = cur->next;
- }
- return tmp;
- }
- // 检测队列是否为空,如果为空返回true,如果非空返回false
- bool QueueEmpty(Queue* q)
- {
-
- assert(q);
- return q->head == NULL;
- }
- // 销毁队列
- void QueueDestroy(Queue* q)
- {
- assert(q);
- QListNode*cur = q->head;
- while (cur != NULL)
- {
- QListNode*next = cur->next;
- free(cur);
- cur = next;
- }
- q->head = q->tail = NULL;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。