❶ 求一个队列的简单例子(c语言的)
二叉树的层次遍历!用队来实现的!
#include <stdio.h>
#include <stdlib.h>
/************************************************************************/
/* 常量定义                                                             */
/************************************************************************/
#define Status  int 
#define TElemType char 
#define TRUE  1
#define FALSE  0
#define OK   1
#define ERROR  -1
#define OVERFLOW -1
#define MAX_LEN  30
typedef struct BTNode
{
 TElemType data;
 struct BTNode *lchild;
 struct BTNode *rchild;
}BiTNode, *BiTree;
/************************************************************************/
/* 操作结果: 构造空二叉树T                                              */
/************************************************************************/
void InitBiTree(BiTree *T)
{ 
 // 产生树根结点,并使T指向此树根结点
 *T = (BiTree)malloc(sizeof(BiTNode)); 
 
 // 存储分配失败
 if( ! *T )  exit(OVERFLOW);
 
 // 二叉树T左右指针域为空
 (*T)->lchild = NULL; 
 (*T)->rchild = NULL; 
}
/************************************************************************/
/* 操作结果:构造二叉树                                                 */
/************************************************************************/
Status CreateBiTree(BiTree *T)
{
 char ch;
 printf("输入节点, 空树以#代替:");
 scanf("\n%c", &ch);
 if(ch == '#') *T = NULL;
 else
 {
  InitBiTree(&(*T));
   (*T)->data = ch;   //生成根
  CreateBiTree(&(*T)->lchild);//构造左子树
  CreateBiTree(&(*T)->rchild);//构造右子树
 }
 return OK;
}
/************************************************************************/
/* 操作结果:层次序遍历T,对每一个结点调用函数visit打印结点             */
/************************************************************************/
Status LevelOrderTraverse(BiTree T, void (*visit)(TElemType e))
{
 BiTree Q[MAX_LEN], p;
 int front = 0, rear = 0;
 if(T == NULL) return OK;
 
 //根结点不为空入队
 rear = (rear + 1) % MAX_LEN ; //队尾指针后移
 Q[rear] = T;
 
 //当队不为空
 while( front != rear)
 {
  //树结点出队
  front = (front + 1) % MAX_LEN;
  p = Q[front];
  //打印结点
  visit(p->data);
  
  //左子树不为空入队
  if(p->lchild != NULL)
  {
   rear = (rear + 1) % MAX_LEN;
   Q[rear] = p->lchild;
  }
  //右子树不为空入队
  if(p->rchild != NULL)
  {
   rear = (rear + 1) % MAX_LEN;
   Q[rear] = p->rchild;
  }
 }
 return OK;
}
/************************************************************************/
/* 打印结点data域                                                       */
/************************************************************************/
void print(TElemType e)
{
 printf("%c ", e);
}
/************************************************************************/
/* 主函数                                                              */
/************************************************************************/
void main()
{
 BiTree T;
 
 //创建树
 CreateBiTree(&T);
 printf("\nLevelOrder:\t");
 LevelOrderTraverse(T, print);
 printf("\n");
 getchar();
}
❷ C语言 求队列的简单例子
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream.h> 
#define TURE 1
#define FALSE 0
#define OVERFLOW 0
#define OK 1
#define ERROR 0
#define MAXQSIZE 100
typedef int qelemtype;
typedef int status; 
typedef struct{
 qelemtype *base;
 int front;
 int rear;
}sqqueue;
status initqueue(sqqueue &q){
 q.base=(qelemtype*)malloc(MAXQSIZE*sizeof(qelemtype));
 if(!q.base)exit(OVERFLOW);
 q.front=q.rear=0;
 return OK;
}//构造一个空队列
void visit(int &y){
 y=2*y;
 cout<<y<<" ";
}
status destroyqueue(sqqueue &q){
 while(q.front){
  q.rear=q.front;
  free(q.base);
  q.front=q.rear;
 }
 return OK;
}//销毁队列
status clearqueue(sqqueue &q){
 q.front=q.rear=0;
 return OK;
}//清空队列
status queueempty(sqqueue q){
 if(q.front==q.rear)
  return TURE;
 return FALSE;
}//若队列为空,返回TURE,否则返回FALSE.
status queuelength(sqqueue q){
 return(q.rear-q.front+MAXQSIZE)%MAXQSIZE;
}//返回队列元素个数,即为队列长度
status gethead(sqqueue q,qelemtype &e){
 if(q.front==q.rear)return ERROR;
 e=q.base[q.front];
 cout<<e<<endl;
 return OK;
}//若队列不空,则用e返回队列的头元素,并返回OK
status enqueue(sqqueue &q,qelemtype e){
 if((q.rear+1)%MAXQSIZE==q.front)return ERROR;
 q.base[q.rear]=e;
 q.rear=(q.rear+1)%MAXQSIZE;
 return OK;
}//插入元素e为q的新的队尾元素
status dequeue(sqqueue &q,qelemtype &e){
 if(q.front==q.rear)return ERROR;
 e=q.base[q.front];
 q.front=(q.front+1)%MAXQSIZE;
 return OK;
}//若队列不空,则删除q的队头元素,用e返回其值,并返回OK.
status queuetraverse(sqqueue q,void(*visit)(int &p)){
 int i=1,p,a;
 a=q.front;
 p=q.base[a];
 while(i<=(q.rear-q.front+MAXQSIZE)%MAXQSIZE)
 {
  visit(p);
  a++;
  i++;
 };
return OK;}
 //从队头到队尾依次对队列调用函数visit().
 void main(){
  sqqueue q;
  int a,b,e,i,j,k;
  initqueue(q);
  cout<<"初始化后队头地址:"<<q.base<<endl;
  cout<<"新建队列!"<<endl;
     cout<<"当前队列是否为空:"<<queueempty(q)<<endl;
  cout<<"定义队列长度:"<<endl;
  cin>>a;
  cout<<"分别输入队列的各个元素,按ENTER"<<endl;
     for(k=1;k<=a;k++){
  cin>>j;
     i=enqueue(q,j);}
  cout<<"现队列元素:"<<endl;
     for(b=1;b<=a;b++)
     cout<<q.base[b-1]<<endl;
  cout<<"当前队列长度:"<<queuelength(q)<<endl;
  cout<<"当前队头元素:"<<endl;
  gethead(q,e);
  cout<<"删除当前头元素!返回其值"<<endl;
  dequeue(q,i);
  cout<<i<<endl;
  cout<<"调用函数后队列变为:";
  queuetraverse(q,visit);
  cout<<endl;
  cout<<"清空队列!"<<clearqueue(q)<<endl;
     cout<<"销毁队列!"<<destroyqueue(q)<<endl;
 }
❸ C语言中栈和队列实现表达式求值的实例
问题是你要什么样的表达式啊,,表达式很多啊。。。
以及,,递归也是栈的一种实现形式吧。。
逆波兰表达式
提交网页链接
逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
chara[3010];
doubletrans(){//floatisbugs
scanf("%s",a);
if(strlen(a)==1){
if(a[0]=='+')returntrans()+trans();
if(a[0]=='-')returntrans()-trans();
if(a[0]=='*')returntrans()*trans();
if(a[0]=='/')returntrans()/trans();
}else{
returnatof(a);
}
}
intmain(){
printf("%f ",trans());
return0;
}
❹ c语言队列操作
pq->rear->next
=
pnew这个代码从队列的尾部增加新节点,
然后pq->rear
=
pnew更新队列尾部指针。队列的数据结构形式就是由一个头front指针,一个尾rear指针来表征,items的设计是用空间换时间,涉及队列大小的操作会非常方便。
队列的特征是先进先出,你给出的链式实现,其实就跟一个链表一样,链表的添加删除如果能理解了,队列只是链表的元素增加/删除
按先进先出特点的一种实现。
但对于队列来说,实现方式不是重点,先进先出的性质才是重点,这在实际应用中很多,比如排队叫号。
❺ C语言中使用队列
如果你用vc,#include<deque>就好了,但是注意要加上using naemspace std;
我是当你用的c++的STL,STL中没有真正的队列和栈,他们都是通过对双端队列的改造得到的,所以包含的文件可能和你想的不一样。而且这些头文件都没有.h结尾!很特别
如果你不是vc,当我没说
❻ 栈与队列的应用(C语言)求解
#include "stdio.h"
#include "malloc.h"
typedef struct node1{
	int *data;
	int top;
	void init(void);
	void del(void);
	int pop(int&);
	void push(int&);
}s;
void node1::init(){
	data=(int*)malloc(sizeof(int)*100);
	top=0;
}
void node1::del(){
	free(data);
	top=0;
}
int node1::pop(int &e){
	if(top==0)return 0;
	e=data[--top];
	return 1;
}
void node1::push(int &e){
	if(top==100)return;
	data[top++]=e;
}
typedef struct node2{
	int *data;
	int top;
	int bottom;
	void init(void);
	void del(void);
	int pop(int&);
	void push(int&);
	void format(s&);
}q;
void node2::init(){
	data=(int*)malloc(sizeof(int)*100);
	top=bottom=0;
}
void node2::del(){
	free(data);
	top=bottom=0;
}
int node2::pop(int &e){
	if(top==bottom)return 0;
	e=data[top++];
	return 1;
}
void node2::push(int &e){
	if(bottom==100)return;
	data[bottom++]=e;
}
void node2::format(s &e){
	int a;
	while(e.pop(a)){
		push(a);
	}
}
int main(){
	s b;q c;
	int a;
	b.init();c.init();
	printf("输入栈中的数,以0结尾\n");
	while(1){
		scanf("%d",&a);
		if(a==0)break;
		b.push(a);
	}
	c.format(b);
	while(c.pop(a)){
		printf("%d\n",a);
	}
	b.del();
	c.del();
	return 0;
}//b为栈,c为队列,c.format(b)为转换函数
❼ C语言的队列如何实现和表示
我能想到的有两种方法(假设队列元素都是int)
一,用链表的方法
struct A
{
    int n;
    struct A *a;
} *p,*head,*rear;
head=rear=NULL;/*头指针,尾指针*/
添加元素:p=(struct A*)malloc(sizeof(struct A));......给新元素赋值.....;rear->a=p;rear=p;
当然添加第一个元素的时候要给head赋值。
删除元素:p=head;head=head->a;free(p);
用的是单向链表,当然也可以用双向链表,不过删除,添加元素的过程要麻烦点。
二,利用数组,当然也可以开辟动态储存空间
int a[N],*head,*rear;  N就是个常数
head=rear=a;
添加元素:scanf("%d",rear-a==N?rear=a:++rear);
删除元素:head-a==N?head=a:head++;
当然要检查队列是否溢出,可以设变量n=0;
每次添加元素n++
每次删除元素n--
当n<0后n>N数据溢出
❽ 用C语言编写队列程序
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define NULL 0
#define OK 1
#define OVERFLOW 0
#define ERROR 0
typedef int QElemType;
typedef int Status;
typedef struct QNode
{ 
 QElemType data;
 QNode *next;
}*QueuePtr;
struct LinkQueue
{ 
 QueuePtr front,rear;//队头,队尾指针
};
//函数列表
void InitQueue(LinkQueue &Q)
{//初始化一个队列
 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
 if(!Q.front)//生成头结点失败
  exit(OVERFLOW);
 Q.front->next=NULL;
}
void DestoryQueue(LinkQueue &Q)
{ //销毁队列
 while(Q.front)
 {
  Q.rear=Q.front->next;//Q.rear指向Q.front的下一个结点
  free(Q.front);//释放Q.front所指结点
  Q.front=Q.rear;//Q.front指向Q.front的下一个结点
 }
}
void ClearQueue(LinkQueue &Q)
{ //将队列清为空
 DestoryQueue(Q);//销毁队列
 InitQueue(Q);//重新构造队列
}
Status QueueEmpty(LinkQueue Q)
{ //判断队列是否为空
 if(Q.front->next==NULL)
  return TRUE;
 else return FALSE;
}
int QueueLength(LinkQueue Q)
{ //求队列的长度
 int i=0;//计数器清0
 QueuePtr p=Q.front;//p指向结点
 while(Q.rear!=p)//p所指向的不是尾结点
 {  
  i++;//计数器加1
  p=p->next;
 }
 return i;
}
Status GetHead(LinkQueue Q,QElemType &e)
{  //若队列不空,则用e返回队头元素
 QueuePtr p;
 if(Q.front==Q.rear) return ERROR;
 p=Q.front->next;//p指向队头结点
 e=p->data;//将队头元素的值赋给e
 return OK;
}
void EnQueue(LinkQueue &Q,QElemType e)
{ //插入元素e为队列Q的新的队尾元素
  QueuePtr p;
     p=(QueuePtr)malloc(sizeof(QNode));
  //动态生成新结点
     if(!p)
     exit(OVERFLOW);
     p->data=e;//将e的值赋给新结点
     p->next=NULL;//新结点的指针为空
     Q.rear->next=p;//原队尾结点的指针域为指向新结点
     Q.rear=p;//尾指针指向新结点
}
Status DeQueue(LinkQueue &Q,QElemType &e)
{ //若队列不为空,删除Q的队头元素,用e返回其值
  QueuePtr p;
     if(Q.front==Q.rear)//队列为空
   return ERROR;
  p=Q.front->next;//p指向队头结点
     e=p->data;//队头元素赋给e
     Q.front->next=p->next;//头结点指向下一个结点
  if(Q.rear==p)//如果删除的队尾结点
   Q.rear=Q.front;//修改队尾指针指向头结点
  free(p);
  return OK;
}
void QueueTraverse(LinkQueue Q,void(*visit)(QElemType))
{ //对队头到队尾依次对队列中每个元素调用函数visit()
  QueuePtr p;
  p=Q.front->next;
  while(p)
  { 
   visit(p->data);//对p所指元素调用visit()
   p=p->next;
  }
  printf("\n");
}
void print(QElemType e)
{
 printf("%2d",e);
}
void main()
{ 
 int i,k;
    QElemType d;
    LinkQueue q;
    InitQueue(q);//构造一个空栈
 for(i=1;i<=5;i++)
 {
  EnQueue(q,i);
 }
 printf("栈的元素为:");
    QueueTraverse(q,print);
    k=QueueEmpty(q);
    printf("判断栈是否为空,k=%d(1:为空9;0:不为空)\n",k);
    printf("将队头元素赋给d\n");
    k=GetHead(q,d);
    printf("队头元素为d=%d\n",d);
    printf("删除队头元素:\n");
    DeQueue(q,d);
    k=GetHead(q,d);
    printf("删除后新的队头元素为d=%d\n",d);
    printf("此时队列的长度为%d\n",QueueLength(q));
    ClearQueue(q);//清空队列
    printf("清空队列后q.front=%u,q.rear=%u,q.front->next=%u\n",q.front,q.rear,q.front->next);
    DestoryQueue(q);
    printf("销毁队列后,q.front=%u,q.rear=%u\n",q.front,q.rear);
❾ C语言实现队列的基本操作
structpQueue
{
ElemType*head;//指向开辟的空间的首地址
Elemtype*tail;
intlength;//(总容量)
intL_now;//(当前容量)
};
if(pQueue.L_now==pQueue.length)
{
每次申请空间都是+N
}
pQueue->tail=p;
❿ C语言中,队列是什么意思,有什么用途
队列是一种特殊的线性表。
队列一种可以实现“先进先出”的存储结构,即“一端入,一端出”,队首(front)出队,队尾(rear)入队,若front指向队首,则rear指向队尾最后一个有效元素的下一个元素;若rear指向队尾,则front指向队首第一个有效元素的下一个元素。
队列特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

(10)c语言队列的应用实例扩展阅读
循环队列各个参数的含义
1、队列初始化front和rear的值都是零,初始化时队列就是空的。
2、队列非空front代表队列的第一个元素rear代表了最后一个有效元素的下一个元素。
3、队列空front和rear的值相等,但是不一定是零。
