数据结构_栈和队列
2018-02-24 22:39
232 查看
栈
栈的特点:遵循“先进后出,后进先出”原则;先压入栈的在栈底,后入的在栈顶,从栈顶开始拿取数据。栈的定义
typedef int DataType; typedef struct Stack { DataType* _array; size_t _top; //栈顶 size_t _end; }Stack;
栈的实现
void StackInit(Stack* s) { assert(s); s->_array = NULL; s->_end = 0; s->_top = 0; } void StackPush(Stack* s, DataType x) { assert(s); //if (s->_end == 0) //{ // s->_end = 3; // s->_array = (DataType*)realloc(s->_array, s->_end*sizeof(DataType)); //} //else if (s->_top < s->_end) //{ // s->_array[s->_top++] = x; //} //else //{ // s->_end *= 2; // s->_array = (DataType*)realloc(s->_array, s->_end*sizeof(DataType)); // s->_array[s->_top++] = x; //} if (s->_top == s->_end) { size_t size = s->_end > 0 ? s->_end * 2 : 3; s->_array = (DataType*)realloc(s->_array, size*sizeof(DataType)); assert(s->_array); s->_end = size; } s->_array[s->_top++] = x; } void StackPop(Stack* s) { assert(s); if (s->_top > 0) { s->_top--; } } DataType StackTop(Stack* s) { assert(s); if (s->_top > 0) { return s->_array[s->_top - 1]; } else return 0; } size_t StackSize(Stack* s) { assert(s); return s->_top; } int StackEmpty(Stack* s) //拍单端栈是否为空 { assert(s); return s->_top; }
调试代码
void TestStack() { Stack s1; StackInit(&s1); StackPush(&s1, 1); StackPush(&s1, 2); StackPush(&s1, 3); StackPush(&s1, 4); StackPush(&s1, 5); while (StackEmpty(&s1)) { printf("%d ", StackTop(&s1)); StackPop(&s1); } printf("\n"); }
队列
队列的特点:遵循“先进先出,后进后出”原则。队列的定义
typedef int DataType; typedef struct QueueNode { DataType _data; struct QueueNode* _next; }QueueNode;
队列的实现
typedef struct Queue { QueueNode* _head; QueueNode* _tail; }Queue; void QueueInit(Queue* q) { assert(q); q->_head = NULL; q->_tail = NULL; } void QueuePush(Queue* q, DataType x) { assert(q); QueueNode* node; node = (QueueNode*)malloc(sizeof(QueueNode)); node->_data = x; node->_next = NULL; assert(node); if (q->_head == NULL) { q->_head = q->_tail = node; } else { q->_tail->_next = node; q->_tail = node; } } void QueuePop(Queue* q) { assert(q); if (q->_head != NULL) { if (q->_head == q->_tail) { free(q->_head); q->_head = q->_tail = NULL; } else { QueueNode* tail = q->_head; q->_head = q->_head->_next; free(tail); } } } DataType QueueFront(Queue* q) { assert(q); if (q->_head != NULL) { return q->_head->_data; } else return 0; } DataType QueueBack(Queue* q) { assert(q); if (q->_tail != NULL) { return q->_tail->_data; } else return 0; } size_t QueueSize(Queue* q) { assert(q); QueueNode* tail = q->_head; size_t x = 1; if (tail == NULL) return 0; while (tail != q->_tail) { x++; tail = tail->_next; } return x; } int QueueEmpty(Queue* q) //判断队列是否为空 { assert(q); return q->_head == NULL ? 0 : 1; }
调试代码
void TestQueue() { Queue q; QueueInit(&q); QueuePush(&q, 1); QueuePush(&q, 2); QueuePush(&q, 3); QueuePush(&q, 4); QueuePush(&q, 5); while (QueueEmpty(&q)) { printf("%d ", QueueFront(&q)); QueuePop(&q); } printf("\n"); }
相关文章推荐
- 数据结构:链表队列
- 数据结构 c语言实现顺序队列(输数字入队,字符出队)
- 数据结构 -- 队列 & 循环队列 -- 数组实现
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- 《数据结构》严蔚敏版(java解)——第三章 栈和队列03 顺序队列操作
- 数据结构-队列和栈的那些事(三)
- 【数据结构】回顾优先队列(堆)
- [数据结构]C语言队列的实现
- 基本数据结构--表、栈和队列
- java数据结构 广搜,队列,循环队列
- 2019数据结构考研(三)------栈和队列
- 数据结构笔记-----队列
- 数据结构与算法回顾之栈和队列
- java 实现数据结构之队列
- 数据结构-07 队列
- 数据结构(C#语言版)——栈和队列
- 数据结构面试之四——队列的常见操作
- Java数据结构——表、栈和队列
- 数据结构之数组实现队列
- python数据结构-队列