[算法导论]第十章《栈和队列》

来源:互联网 发布:tcp默认端口号 编辑:程序博客网 时间:2024/06/05 02:30

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;elsereturn 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;}



0 0