队列的基本 *** 作

队列的基本 *** 作,第1张

#include <stdioh> #include <stdlibh> #include <malloch> typedef int QElemtype; typedef struct QNode{ QElemtype data; struct QNode next; }QNode,QLink; typedef struct{ QLink front; QLink rear; int length; }QPtr; bool InitQueue(QPtr &Q) { Qfront = Qrear = (QNode )malloc(sizeof(QNode)); //动态分配一个空节点使头指针和尾指针指向它 if(!Qfront)return 0; Qrear->next = NULL; Qlength = 0; //初始化队列长度为0 return 1; } bool EnQueue(QPtr &Q,QElemtype e) { QLink p = (QNode )malloc(sizeof(QNode)); //p指向要插入的节点 if(!p)return 0; p->data = e; p->next = NULL; Qrear->next = p; //将节点插入到队尾并修改队尾指针 Qrear = p; ++Qlength; //队列长度加1 return 1; } void Print(QPtr Q) { QLink p = Qfront->next; for (; p; p = p->next) { printf("%d ",p->data); } return; } bool TurnOver(QPtr &Q) { QLink p = Qfront->next,q; if (Qlength == 0) return 0; Qfront->next = Qrear; Qrear = p; p = Qfront->next; while (p != Qrear) { q = Qrear; while (q->next != p)q = q->next; p ->next = q; p = q; } Qrear->next = NULL; return 1; } int main() { QPtr Q; QElemtype elem; InitQueue(Q); int i = 0,n = 0; printf("输入你要录入的整数个数:"); scanf("%d",&n); printf("现在请输入数据:\n"); for (; i < n; ++i) { scanf("%d",&elem); EnQueue(Q,elem); } printf("队列中元素为:"); Print(Q); printf("逆置队列后的元素为:"); TurnOver(Q); Print(Q); printf("\n"); return 0; } 程序如上 VC++60环境下 我调试过了 没问题 就是要注意下程序的缩进 因为QQ问问中无法正确显示出程序的缩进 所以 if ,for while 循环嵌套处要注意 如果不行再联系我

希望采纳

首先要明白队列是 先进先出 InQueue(Q,'H'); InQueue(Q,'R'); InQueue(Q,y); //现在队列内容从前到后依次是HRC OutQueue(Q,x);InQueue(Q,x); //,H 出队列,并且把H赋于x,然后x='H' 入队列,现在队列内容从前到后依次是RCH

循环队列不是这样用的吧,应该是在入队出队 *** 作都有的情况下用的(不是先全入队,再出队),大概就是出队后空出来的空间可以留着以后进队用。

初始队空:

front=bottom=1;

进队大概是:

void push(int x )

{

bottom++;

if (bottom>m) bottom=1;

if (front==bottom)

{

cout<<"Full!"<<endl;

return;

}

queue[bottom]=x;

}

出队大概是:

int pop()

{

if (front==bottom)

{

cout<<"Empty!"<<endl;

return 0;

}

front++;

if (front>m) front=1;

return queue[front];

}

这是基础的,细节自己处理

1队列先进先出,栈先进后出。

2对插入和删除 *** 作的"限定"。

栈是限定只能在表的一端进行插入和删除 *** 作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除 *** 作的线性表。

从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本 *** 作集不同外,主要区别是对插入和删除 *** 作的"限定"。

栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本 *** 作的特殊性,栈必须按"后进先出"的规则进行 *** 作,而队列必须按"先进先出"的规则进行 *** 作。和线性表相比,它们的插入和删除 *** 作受更多的约束和限定,故又称为限定性的线性表结构。

3遍历数据速度不同。栈只能从头部取数据

也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性队列怎不同,他基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多

栈(Stack)是限定只能在表的一端进行插入和删除 *** 作的线性表。

队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除 *** 作的线性表。

从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本 *** 作集不同外,主要区别是对插入和删除 *** 作的"限定"。

栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本 *** 作的特殊性,栈必须按"后进先出"的规则进行 *** 作,而队列必须按"先进先出"的规则进行 *** 作。和线性表相比,它们的插入和删除 *** 作受更多的约束和限定,故又称为限定性的线性表结构。可将线性表和栈及队列的插入和删除 *** 作对比如下:

Insert(L,n+1,x)

Delete(L,n)

而栈只允许在表尾一端进行插入和删除

队列

Insert(L,n+1,x)

Delete(L,1)

队列只允许在表尾一端进行插入,在表头一端进行删除

我的理解是 你想用数组模拟 队列?不是的话下面不用看,回复我给我再说一下题意,我重新给你写!

首先输入一个 *** 作,1入队,2出队,3退出

如果是1,再输入一个将要入队列的 数据,

#include <stdioh>

#include <stdlibh>

#include <stringh>

#define LEN 1000

int queue[LEN], fir, end;

void printQueue()

{

int i = 0;

for(i = fir; i < end; ++ i)

{

printf("%d ", queue[i]);

}

printf("\n");

}

void insertQueue()

{

int value = 0, i = 0;

printf("Enter the data which you want to insert to queue\n");

scanf("%d", &value);

queue[end ++] = value;

printQueue();

}

void deleteQueue()

{

printf("after delete the top data!\n");

fir ++;

printQueue();

}

void demo()

{

int Number = 0;

while(1)

{

printf("Enter the number:\n");

printf("1insert\n");

printf("2delete\n");

printf("3exit!\n");

scanf("%d", &Number);

if(Number < 1 || Number > 4) return;

switch(Number)

{

case 1: insertQueue(); break;

case 2: deleteQueue(); break;

case 3: exit(0);

default: return;

}

}

}

void creatQueue()

{

int i = 0;

fir = 0, end = 0;

for(i = 0; i < LEN; ++ i)

{

queue[i] = 0;

}

}

int main()

{

creatQueue();

demo();

return 0;

}

单个军人队列跟平时训练差不多!一个班一起考核!先是整队清点人数向在场首长报告!按首长指示开始拉程序,先是原地的动作!做完就是三大步伐,当然也有可能正步有可能不考!完了整队向在场首长报告!当然也有可能直接考班队列!

栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,称插入、删除这一端为栈顶,另一端称为栈底。表中无元素时为空栈。栈

的修改是按后进先出的原则进行的,我们又称栈为LIFO表(Last

In

First

Out)。通常栈有顺序栈和链栈两种存储结构。

栈的基本运算有六种:

·构造空栈:InitStack(S)

·判栈空:

StackEmpty(S)

·判栈满:

StackFull(S)

·进栈:

Push(S,x)

·退栈:

Pop(S)

·取栈顶元素:StackTop(S)

在顺序栈中有"上溢"和"下溢"的现象。

·"上溢"是栈顶指针指出栈的外面是出错状态。

·"下溢"可以表示栈为空栈,因此用来作为控制转移的条件。

顺序栈中的基本 *** 作有六种:·构造空栈·判栈空·判栈满·进栈·退栈·取栈顶元素

链栈则没有上溢的限制,因此进栈不要判栈满。链栈不需要在头部附加头结点,只要有链表的头指针就可以了。

链栈中的基本 *** 作有五种:·构造空栈·判栈空·进栈·退栈·取栈顶元素

队列(Queue)是一种运算受限的线性表,插入在表的一端进行,而删除在表的另一端进行,允许删除的一端称为队头(front),允许插入的

一端称为队尾(rear)

,队列的 *** 作原则是先进先出的,又称作FIFO表(First

In

First

Out)

。队列也有顺序存储和链式存储两种存储结

构。

队列的基本运算有六种:

·置空队:InitQueue(Q)

·判队空:QueueEmpty(Q)

·判队满:QueueFull(Q)

·入队:EnQueue(Q,x)

·出队:DeQueue(Q)

·取队头元素:QueueFront(Q)

顺序队列的"假上溢"现象:由于头尾指针不断前移,超出向量空间。这时整个向量空间及队列是空的却产生了"上溢"现象。

为了克服"假上溢"现象引入循环向量的概念,是把向量空间形成一个头尾相接的环形,这时队列称循环队列。

判定循环队列是空还是满,方法有三种:

·一种是另设一个布尔变量来判断;

·第二种是少用一个元素空间,入队时先测试((rear+1)%m

=

front)

满:空;

·第三种就是用一个计数器记录队列中的元素的总数。

队列的链式存储结构称为链队列,一个链队列就是一个 *** 作受限的单链表。为了便于在表尾进行插入(入队)的 *** 作,在表尾增加一个尾指

针,一个链队列就由一个头指针和一个尾指针唯一地确定。链队列不存在队满和上溢的问题。在链队列的出队算法中,要注意当原队中只

有一个结点时,出队后要同进修改头尾指针并使队列变空。

以上就是关于队列的基本 *** 作全部的内容,包括:队列的基本 *** 作、C语言,数据结构写个队列的程序、急求一循环队列的程序,用C#或者Pascal编写的均可等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9355030.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存