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,因為列隊規定必須從隊頭刪除元素,「允許」二字有待考究