#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编写的均可等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)