1、栈
1.1栈的概念及结构
栈时一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
1.2栈的基本实现
栈的结构体定义:
typedef int STDataType; typedef struct Stack {STDataType* a;int top;int capacity; }ST;
栈的初始化:
void STInit(ST* pst) {assert(pst);pst->a = NULL;pst->top = 0; //指向栈顶元素的下一个位置pst->capacity = 0; }
栈的销毁:
void STDestroy(ST* pst) {assert(pst);free(pst->a);pst->a = NULL;pst->top = 0;pst->capacity = 0; }
入栈:
void STPush(ST* pst, STDataType x) {if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++; }
出栈:
void STPop(ST* pst) {assert(pst);assert(!STEmpty(pst));pst->top--; }
栈顶元素:
STDataType STTop(ST* pst) {assert(pst);assert(!STEmpty(pst));return pst->a[pst->top - 1]; }
判空:
bool STEmpty(ST* pst) {assert(pst);return pst->top == 0; }
栈的大小:
int STSize(ST* pst) {assert(pst);return pst->top; }
2、队列
2.1队列的概念及结构
队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的性质。
进行插入操作的一端称为队尾,进行删除操作的一端称为队头。
2.2队列的基本实现
队列的结构体定义:
typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct Queue {QNode* phead;QNode* ptail;int size; }Queue;
队列的基本操作:
//队列初始化 void QueueInit(Queue* pq) {assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0; }//队列销毁 void QueueDestroy(Queue* pq) {assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0; }//入队 void QueuePush(Queue* pq, QDataType x) {assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail\n");return;}newnode->data = x;newnode->next = NULL;if (pq->ptail == NULL){assert(pq->phead == NULL);pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++; }//出队 void QueuePop(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));if (pq->phead->next == NULL){//单个节点,直接删除free(pq->phead);pq->phead = pq->ptail = NULL;}else{//多个节点,相当于头删QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--; }//队头元素 QDataType QueueFront(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->phead->data; }//队尾元素 QDataType QueueBack(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data; }//队列长度 int QueueSize(Queue* pq) {assert(pq);return pq->size; }//队列判空 bool QueueEmpty(Queue* pq) {assert(pq);return pq->phead == NULL && pq->ptail == NULL; }