[算法导论]第十章《栈和队列》
2014-03-04 21:50
218 查看
1、栈和队列
栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素的预先设定好的。栈规定元素是先进后出(FILO),队列规定元素是先进先出(FIFO)。栈和队列的实现可以采用数组和链表进行实现。栈的基本操作包括入栈push和出栈pop,栈有一个栈顶指针top,指向最新如栈的元素,入栈和出栈操作操作都是从栈顶端进行的。
队列的基本操作包括入队enqueue和出队dequeue,队列有队头head和队尾tail指针。元素总是从队头出,从队尾入。采用数组实现队列时候,为了合理利用空间,可以采用循环实现队列空间的有效利用。
关于栈和队列的基本操作如下图所示:
栈的几种操作(伪代码):
队列的操作(伪代码):
代码的C++实现:
/* *Created by RogerKing *Email:jin_tengfei@163.com */ #include <iostream> #include <string> using namespace std; /*****************栈*******************************************************/ typedef struct Stack { int top;//栈顶指针 int stacksize; int *s;//数组 }Stack; //栈的初始化 void Init_Stack(Stack *S) { S->stacksize = 100; S->s =(int*)malloc(sizeof(int)*S->stacksize); S->top = -1; } //打印栈 void Print(Stack S) { int i; cout<<"从栈底到栈顶的顺序输出:"; for(i = 0; i <= S.top; i++) cout<<S.s[i]<<' '; cout<<endl; } //检查一个栈是否为空 bool Stack_Empty(Stack *S) { if(S->top == 0) return true; else return false; } //入栈 void Push(Stack *S, int x) { S->top++; S->s[S->top] = x; } //出栈 int Pop(Stack &S) { if(Stack_Empty(&S)) { cout<<"underflow"<<endl; exit(0); } else { S.top--; return S.s[S.top+1]; } } /*****************队列********************************************************/ typedef struct Queue { int tail;//队列头指针 int head;//队列尾指针 int length;//队列长度 int *q;//数组 }Queue; //从队列头到队列尾输出 void Print(Queue Q) { int i; cout<<"从队列头到队列尾:"; if(Q.tail >= Q.head) { for(i = Q.head; i < Q.tail;i++) cout<<Q.q[i]<<' '; cout<<endl; } //因为循环的原因,队列尾可能在队列头的前面 else { for(i = Q.head; i <= Q.length; i++) cout<<Q.q[i]<<' '; for(i = 1; i < Q.tail; i++) cout<<Q.q[i]<<' '; cout<<endl; } } //入队列 void Enqueue(Queue *Q, int x) { Q->q[Q->tail] = x; if(Q->tail == Q->length) Q->tail = 1; else Q->tail++; } //出队列 int Dequeue(Queue &Q) { int x = Q.q[Q.head]; if(Q.head == Q.length) Q.head = 1; else Q.head++; return x; } int main() { // Stack s;//栈的测试 // Init_Stack(&s); // Push(&s,12); // Push(&s,23); // Push(&s,34); // Push(&s,96); // Push(&s,65); // Print(s); // cout<<"top is:"<<Pop(s)<<endl; Queue q;//队列测试 q.length=10; q.q = (int*)malloc(sizeof(int)*q.length); q.head=0; q.tail=0; Enqueue(&q,10); Enqueue(&q,30); cout<<"head="<<q.head<<",tail="<<q.tail<<endl; Print(q); cout<<"删除队列元素:"<<Dequeue(q)<<endl; cout<<"head="<<q.head<<",tail="<<q.tail<<endl; }
相关文章推荐
- 算法导论第十章总结以及课后题答案
- 算法导论 python代码 第十章
- 算法导论第十章--队列的实现
- 归并排序的c语言代码--算法导论一致
- 指示器随机变量,算法导论5.2
- 【学习笔记】<算法导论>基础知识1.1
- 算法导论之快速排序
- 每对顶点间的最短路径基本算法 --- 算法导论笔记
- 算法导论 5.1-3
- 【算法导论】地图染色算法
- 算法导论10.2-7答案
- 算法导论—快排及优化以及和STL sort 的比较
- 堆排序(算法导论实现)
- 【算法导论】最大流算法
- 算法导论第15章15.2-2
- 【算法导论学习-19】1个stack实现queue
- 【算法导论】学习笔记——第7章 快速排序
- 算法导论学习笔记-找数组中第二小的数
- 堆排序(最大堆[1])--【算法导论】
- [算法导论] 函数的增长---渐进记号