您的位置:首页 > 其它

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: