c语言栈队列
1. c语言实现队列和栈的方法
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define N 20
typedef char SElemType;
typedef int Status;typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;#include<stdio.h>
#include<stdlib.h>Status CreatStack(SqStack &S){
//创建栈
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//CreatStackStatus Push(SqStack &S,SElemType e){
//插入e为新的栈顶元素
if(S.top-S.base>=S.stacksize){//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)exit (OVERFLOW);//存储空间分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//PushStatus Pop(SqStack &S ,SElemType &e){
//若栈不空,删除栈顶元素,并用e返回其值
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}//Pop typedef char QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QNodePtr;typedef struct{
QNodePtr front;
QNodePtr rear;
}LinkQueue;Status CreatQueue(LinkQueue &Q){
//建立一个空的链式栈
Q.front=Q.rear=(QNodePtr)malloc(sizeof(QNode));
if(!Q.front)exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}Status EnQueue(LinkQueue &Q,QElemType e){ QNodePtr p;
p=(QNodePtr)malloc(sizeof(QNode));
if(!p)exit(OVERFLOW);
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}Status DeQueue(LinkQueue &Q,QElemType &e){QNodePtr p;<br>if(Q.front==Q.rear) return ERROR;<br>p=Q.front->next; e=p->data;<br>Q.front->next=p->next;<br>if(Q.rear==p) Q.rear=Q.front;<br>free(p);<br>return OK;<br>}int stackPalindrom_Test()//判别输入的字符串是否回文序列,是则返回1,否则返回0
{
printf("栈练习,请输入要判断的字符串以#作为结束符,不要超过二十个字符\n");
SqStack S;
CreatStack(S);
char c;
SElemType a;
SElemType b[N];
int count = 0;
fgets( b, N, stdin );
while((b[count])!='#')
{
Push(S,b[count]); //进栈
count++;
}
int i = 0;
while(i < count)
{
Pop(S,a);
if(a!=b[i])
return ERROR;
i++;
}
return OK;}//stackPalindrom_Test int queuePalindrom_Test()//判别输入的字符串是否回文序列,是则返回1,否则返回0
{
printf("队列练习,请输入要判断的字符串以#作为结束符,不要超过二十个字符\n");
LinkQueue Q;
CreatQueue(Q); char c;
SElemType a;
SElemType b[N];
int count = 0;
fgets( b, N, stdin );
while((b[count])!='#')
{
EnQueue(Q,b[count]);; //入列
count++;
} while(count-- > 0)
{
DeQueue(Q,a);
if(a!=b[count])
return ERROR;
}
return OK;
}//queuePalindrom_Test Status main(){ if(stackPalindrom_Test()==1)
printf("是回文\n");
else printf("不是回文\n"); if(queuePalindrom_Test()==1)
printf("是回文\n");
else printf("不是回文\n");
return OK;
}
2. 栈与队列的应用(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)为转换函数
3. C语言栈和队列问题:停车场停车问题
#ifndef__PLOT_H__#define__PLOT_H__#defineFALSE0#defineTRUE1#defineMONEY1//单价可以自己定义#defineMAX_STOP10#defineMAX_PAVE100//存放汽车牌号typedefstruct{
inttime1;//进入停车场时间
inttime2;//离开停车场时间
charplate[10];
//汽车牌照号码,定义一个字符指针类型}Car;//停放栈typedefstruct{
CarStop[MAX_STOP-1];//各汽车信息的存储空间
inttop;//用来指示栈顶位置的静态指针}Stopping;//等候队列typedefstruct{intcount;//用来指示队中的数据个数
CarPave[MAX_PAVE-1];//各汽车信息的存储空间
intfront,rear;//用来指示队头和队尾位置的静态指针}Pavement;//让路栈typedefstruct{
CarHelp[MAX_STOP-1];//各汽车信息的存储空间
inttop;//用来指示栈顶位置的静态指针}Buffer;
Stoppings;
Pavementp;
Bufferb;
Carc;charC[10];voidstop_pave();//车停入便道voidcar_come();//车停入停车位voidstop_to_buff();//车进入让路栈voidcar_leave();//车离开voidwelcome();//主界面函数voidDisplay();//显示车辆信息#
源文件PLot.c
#include"PLot.h"#include<stdio.h>#include<time.h>//包含时间函数的头文件#include<string.h>#include<stdlib.h>voidstop_to_pave()//车停入便道{//判断队满
if(p.count>0&&(p.front==(p.rear+1)%MAX_PAVE))
{printf("便道已满,请下次再来 ");
}else
{strcpy(p.Pave[p.rear].plate,C);
p.rear=(p.rear+1)%MAX_PAVE;//队尾指示器加1
p.count++;//计数器加1
printf("牌照为%s的汽车停入便道上的%d的位置 ",C,p.rear);
}
}voidcar_come()//车停入停车位{printf("请输入即将停车的车牌号:");//输入车牌号
scanf("%s",&C);if(s.top>=MAX_STOP-1)//如果停车位已满,停入便道
{
stop_to_pave();//停车位->便道函数
}else
{
s.top++;//停车位栈顶指针加1
time_tt1;longintt=time(&t1);//标记进入停车场的时间
char*t2;
t2=ctime(&t1);//获取当前时间
c.time1=t;strcpy(s.Stop[s.top].plate,C);//将车牌号登记
printf("牌照为%s的汽车停入停车位的%d车位,当前时间:%s ",C,s.top+1,t2);
}return;
}voidstop_to_buff()//车进入让路栈{//停车位栈压入临时栈,为需要出栈的车辆让出道
while(s.top>=0)
{
if(0==strcmp(s.Stop[s.top--].plate,C))
{break;
}//让出的车进入让路栈
strcpy(b.Help[b.top++].plate,s.Stop[s.top+1].plate);printf("牌照为%s的汽车暂时退出停车位 ",s.Stop[s.top+1].plate);
}
b.top--;//如果停车位中的车都让了道,说明停车位中无车辆需要出行
if(s.top<-1)
{printf("停车位上无此车消息 ");
}else
{printf("牌照为%s的汽车从停车场开走 ",s.Stop[s.top+1].plate);
}//将让路栈中的车辆信息压入停车位栈
while(b.top>=0)
{strcpy(s.Stop[++s.top].plate,b.Help[b.top--].plate);printf("牌照为%s的汽车停回停车位%d车位 ",b.Help[b.top+1].plate,s.top+1);
}//从便道中->停车位
while(s.top<MAX_STOP-1)
{if(0==p.count)//判断队列是否为空
{break;
}//不为空,将便道中优先级高的车停入停车位
else
{strcpy(s.Stop[++s.top].plate,p.Pave[p.front].plate);printf("牌照为%s的汽车从便道中进入停车位的%d车位 ",p.Pave[p.front].plate,s.top+1);
p.front=(p.front+1)%MAX_PAVE;
p.count--;
}
}
}voidcar_leave()//车离开{printf("请输入即将离开的车牌号: ");scanf("%s",&C);if(s.top<0)//判断停车位是否有车辆信息
{printf("车位已空,无车辆信息! ");
}else
{
stop_to_buff();
}
time_tt1;
longintt=time(&t1);
c.time2=t;//标记离开停车场的时间
char*t2;
t2=ctime(&t1);//获取当前时间
printf("离开时间%s 需付%ld元 ",t2,MONEY*(c.time2-c.time1)/10);
}voidDisplay()
{inti=s.top;if(-1==i)
{printf("停车场为空 ");
}
time_tt1;longintt=time(&t1);//标记显示时的时间
printf(" 车牌号 停放时间 当前所需支付金额 ");while(i!=-1)
{
printf(" %s %d秒 %d元 ",s.Stop[i].plate,t-c.time1,MONEY*(t-c.time1)/10);
i--;
}
}voidwelcome()
{printf(" *******************目前停车场状况*********************** ");printf(" 停车场共有%d个车位,当前停车场共有%d辆车,等候区共有%d辆车 ",MAX_STOP,s.top+1,(p.rear+MAX_PAVE-p.front)
%MAX_PAVE);printf(" ******************************************************** ");printf(" ---------------WelcometoourCarParking--------------- ");
printf(" *1.Parking* ");
printf(" *2.leaving* ");
printf(" *3.situation* ");
printf(" *4.exit* ");
printf(" -------------------------------------------------------- ");
}
主函数main.c
/**********************************************************
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,
汽车按到达的先后次序停放。若车场满了,车要在门外的便道上等候
,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由
于通道窄,在它后面的车要先退出,待它走后依次进入。汽车离开
时按停放时间收费。
基本功能要求:
1)建立三个数据结构分别是:停放队列,让路栈,等候队列
2)输入数据模拟管理过程,数据(入或出,车号)。
***********************************************************/#include"PLot.h"intmain()
{//初始化
s.top=-1;
b.top=0;
p.rear=0;
p.count=0;
p.front=0;while(1)
{
system("clear");
welcome();inti,cho;
scanf("%d",&i);if(1==i)car_come();
if(2==i)car_leave();if(3==i)Display();if(4==i)break;
printf("返回请输入1 ");
scanf("%d",&cho);if(1==cho)
{continue;
}else
{
printf("您的输入有误,请重新输入 ");
scanf("%d",&cho);continue;
}
}return0;
}
4. C语言栈及队列问题
1、按链表的相反顺序打印出链表中各节点的值
typedef struct _l
{
int data;
struct _l *next;
} link;
void func(link *p)
{
if(p!=NULL)
{
func(p->next);
printf("%d",p->data);
}
}
2、一个队列管理的模拟系统
typedef struct _l
{
int data;
struct _l *next;
} link;
link *tail=NULL;
//1.队列初始化
int init()
{
tail=(link *)malloc(sizeof(link));
if(tail!=NULL)
{
tail->next=tail;
return 1;
}
return 0;
}
//2.当键盘输入一个正整数时,把它作为一个队列元素入队列
int insert(int n)
{
link *p;
p=(link *)malloc(sizeof(link));
if(p==NULL)
{
return 0;
}
p->data=n;
p->next=tail->next;
tail->next=p;
return 0;
}
//3.当键盘输入一个负整数时,则队头元素出列
int delete()
{
link *p=tail,*q=p;
while(p->next!=tail)
{
q=p;p=p->next;
}
if(p==q)
{
return 0;//队列空
}
else
{
q->next=p->next;
free(p);
return 1;
}
}
//4.当键盘输入0时,退出系统
//5.每输入一个整数,输出经过队列操作后队列中的所有元素
void trans()
{
link *p=tail->next;
while(p!=tail)
{
printf("%d",p->data);
p=p->next;
}
}
int main()
{
int n;
init();
while(true)
{
scanf("%d",&n);
if(n==0)
{
break;
}
else if(n>0)
{
insert(n);
}
else
{
delete();
}
trans();
}
}
5. C语言解决队列排队 栈排队 堆排队的用法
你的想法适用于事后分析,已经知道每个人到达的时间、在柜台处理问题用的时间等信息。
如果是随机到达的,按你的想法就需要每到达一个人就重新排序计算一次,显然要比用队列或栈效率低。
6. C语言解决队列排队 栈排队 堆排队的用法 不用写代码,就问几个思想方面的问题 比如 有二十个
C语言里面的链表是一种数据结构 是一种线形的存储结构
链表和数组一样,也是将一组同类型的数据组织在一起的一种数据结构
不同的是
数组采用的是顺序存储,依靠数组的首地址和元素的相对地址(下标)来实现访问。
优点是访问方便快捷,而缺点是数组是静态的,不利于实现元素的动态增减。
而链表采用的是离散存储,依靠节点间的指向下一个节点的指针来实现访问。
其优缺点和数组相反
补充:
链表里可以有不同种类型数据
7. 计算机c语言中 什么是栈和队列
栈和队列是属于数据结构的范畴,可以通过各种方法来实现,在各种语言中一般都有版共同的特点。权
在c语言中一般通过结构体来实现。写一个结构体来存放栈或者队列的元素的属性,比如使用变量来记录栈或者队列的长度,还有元素的值等。结构体的内容可以包含该结构体类型指针,在初始化结构体的时候通过把这个指针指向另外一个这种类型的结构体,就可以实现把这些元素串联起来。
数据结构一般还有相应的操作函数,用这些函数可以在已经串联好的栈和队列里对元素进行查找,删除,增加,取值等操作。通过不同的取值操作方法可以衍生出不同的数据结构。
比如,队列先进先出,栈先进后出。意思是通过添加元素的函数在栈或者队列里添加元素,然后通过取值函数取值时对应的顺序不一样,队列先进列的元素会先被取到,而栈先进栈的元素会后被取到
8. C语言写 栈队列(先进先出的)
#include<stdio.h>
#include<malloc.h>typedef struct node /*定义新类型结构体结点*/
{
int data;/*数据成员可以是多个不同类型的数据*/
struct node *next;/*指针变量成员只能是一个*/
}NODE;/*节点结束*/typedef struct qnode /*定义结点类型的变量名*/
{
NODE *front;/*设定结点头指针变量*/
NODE *rear;/* 设定结点尾指针变量*/
}QNODE; /* 链队列的结点定义 */ void InitQueue(QNODE *Q)/*定义指针Q*/
{
NODE *p;/*定义指针p*/
p=(NODE *)malloc(sizeof(NODE));/*分配结点字节的容量*/
Q->front=p; /*指定头指针p*/
Q->front->next=NULL;/*建立空队列*/
Q->rear=Q->front;/*改变Q的值*/
printf("The init is complete!");}
void *QueuePush(QNODE *Q)
{
NODE *p;
p=(NODE *)malloc(sizeof(NODE));/*分配结点字节的容量*/
printf("Please input a number :");/*请输入一个数*/
scanf("%d",&p->data);/*给第一个结点赋值*/
p->next=NULL;/*指定尾结点*/
Q->rear->next=p;/*指定尾新结点p的地址*/
Q->rear=p;/*指定队尾结束*/
printf("The %d has been pushed into the Queue!",p->data);/*显示数据成员*/
return 0;/*程序结束*/
}
void *QueuePop(QNODE *Q)
{
NODE *p;/*定义结点指针*/
if(Q->front->next==NULL) return 0;/*判断对前是否为空,如果是就结束*/
p=Q->front->next;/*指向下以个成员*/
Q->front->next=p->next;/*依次向下循环*/
if(Q->rear==p) Q->rear=Q->front;/*队尾与对头相同*/
printf("The %d has been pop from the queue! \n",p->data);/*显示队列成员*/
free(p);
return 0;
}
void *PrintQueue(QNODE *Q)
{
NODE *p;/*定义链结点*/
p=Q->front->next;/*指定对头*/
while(p!=NULL)/*如不为空*/
{
printf("%5d",p->data);/*显示数据成员*/
p=p->next;/*指定第二个成员*/
}
return 0;
} void main()
{
QNODE *T;
int i=0;/*取值*/
printf("1.InitQueue 2.QueuePush 3.QueuePop 4.PrintQueue 5.Quit \n");
while(i!=5)
{
printf("Please choose the gongneng:");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1: InitQueue(T); printf("\n"); break;
case 2: QueuePush(T); printf("\n"); break;
case 3: QueuePop(T); printf("\n"); break;
case 4: printf("The queue's numbers are:");
PrintQueue(T); printf("\n"); break;
case 5: printf("\n"); break;}
}
}
9. 关于C语言中栈和队列的选择题
AB都对,鉴定完毕。 不过如果一定要选一个,我会选B,因为列队规定必须从队头删除元素,“允许”二字有待考究