程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 用兩個棧實現隊列的源代碼

用兩個棧實現隊列的源代碼

編輯:關於C語言

 

/*

 * 用兩個棧實現隊列

 */

#include<stdio.h>

#include<stdlib.h>

typedef struct stack

{

 //用來保存元素

 int *a;

 //當前的下標

 int loc;

 //棧中最多可以容納的元素個數

 int max;

}st;

/*

 * 初始化指定大小的棧

 */

st *initstack(int num)

{

 st *s=(st *)malloc(sizeof(st));

 if(s==NULL)

 {

  printf("create fail!\n");

  exit(1);

 }

 s->loc=0;

 s->max=num;

 s->a=(int *)malloc(sizeof(int)*num);

 if(s->a==NULL)

 {

  printf("create fail!\n");

  exit(1);

 }

 return s;

}

/*

 * 判斷棧是否為空(空:返回1 非空:返回0)

 */

int isstackempty(st *s)

{

 //棧為空

 if(s->loc==0)return 1;

 else return 0;

}

/*

 * 判斷棧是否為滿(滿:返回1 非滿:返回0)

 */

int isstackfull(st *s)

{

 //棧為滿

 if(s->loc==s->max)return 1;

 else return 0;

}

/*

 * 棧中元素個數

 */

int getstacknum(st *s)

{

 if(isstackempty(s)==1)return 0;

 else return s->loc;

}

/*

 * 入棧

 */

void pushstack(st *s,int value)

{

 //棧滿,無法入棧

 if(isstackfull(s)==1)

 {

  printf("棧已滿,無法入棧!\n");

  exit(1);

 }

 s->a[s->loc]=value;

 s->loc++;

}

/*

 * 出棧

 */

int popstack(st *s)

{

 if(isstackempty(s)==1)

 {

  printf("棧為空,無法出棧!\n");

  exit(1);

 }

 int temp=s->a[s->loc-1];

 s->loc--;

 return temp;

}

/*

 * 查看棧頂元素

 */

int peekstack(st *s)

{

 if(isstackempty(s)==1)

 {

  printf("棧為空,無法查看棧頂元素!\n");

  exit(1);

 }

 int temp=s->a[s->loc-1];

 return temp;

}

/*

 * 將一個棧中的元素拷貝到另一棧中

 */

void copy(st *src,st *dest)

{

 //拷貝過程中發生溢出

 if((src->loc+dest->loc)>dest->max)

 {

  printf("拷貝過程中發生溢出!\n");

  exit(1);

 }

 while(isstackempty(src)!=1)

 {

  int value=popstack(src);

  pushstack(dest,value);

 }

}

/*

 * 打印棧中的各個元素

 */

void printstack(st *s)

{

 if(isstackempty(s)==1)

 {

  printf("棧為空,無法打印棧中各個元素!\n");

  exit(1);

 }

 while(isstackempty(s)!=1)

 {

  int value=popstack(s);

  printf("%d--->",value);

 }

}

/*

 * 入隊列(入隊列的元素保存在src中)

 */

void pushqueue(st *src,st *dest,int value)

{

 if(src->loc==src->max)

 {

  printf("隊列已滿,無法入隊!\n");

  exit(1);

 }

 src->a[src->loc]=value;

 src->loc++;

}

/*

 * 出隊列

 * (如果dest不為空,則直接從dest彈出一個元素)

 * (如果dest為空,src不為空,則先將src中的元素拷貝到dest中,在從dest中彈出一個元素)

 */

int popqueue(st *src,st *dest)

{

 if(isstackempty(src)==1&&isstackempty(dest)==1)

 {

  printf("隊列為空,無法出隊!\n");

  exit(1);

 }

 if(isstackempty(dest)!=1)

 {

  int value=popstack(dest);

  return value;

 }

 else if(isstackempty(dest)==1&&isstackempty(src)!=1)

 {

  copy(src,dest);

  int value=popstack(dest);

  return value;

 }

}

int main()

{

 int num=3;

 int value=0;

 st *src=initstack(num);

 st *dest=initstack(num);

 pushstack(src,1);

 pushstack(src,2);

 value=popqueue(src,dest);

 printf("彈出的元素=%d\n",value);

 pushstack(src,3);

 pushstack(src,4);

 pushstack(src,5);

 value=popqueue(src,dest);

 printf("彈出的元素=%d\n",value);

 value=popqueue(src,dest);

 printf("彈出的元素=%d\n",value);

 value=popqueue(src,dest);

 printf("彈出的元素=%d\n",value);

 value=popqueue(src,dest);

 printf("彈出的元素=%d\n",value);

 return 0;

}

 

摘自:johnny710vip的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved