두 스 택 은 하나의 대기 열 을 실현 하고 C 언어 가 실현 되 며 대기 열 은 신축 할 수 있 으 며 임의의 수의 요 소 를 수용 할 수 있 습 니 다.

16507 단어 C 언어
1. 사고: 1. 두 개의 빈 스 택 A 와 B 를 만 듭 니 다.2. A 스 택 은 대열 의 입구 로 하고 B 스 택 은 대열 의 출구 로 한다.3. 대기 열 에 들 어 가 는 작업: 즉, 스 택 A 입 니 다.4. 대기 열 작업: 만약 에 스 택 B 가 비어 있 으 면 A 스 택 의 내용 을 스 택 에서 내 보 내 고 B 스 택 을 누 르 고 B 스 택 을 나 갑 니 다.빈 틈 없 이 창고 밖으로 나 가기;
2. 코드:
1. 헤더 파일: stackto_quue. h: 대기 열, 스 택 의 데이터 구조 와 각종 작업 함수 가 봉인 되 었 습 니 다.
  1 #ifndef STACK_TO_QUEUE_H
  2 #define STACK_TO_QUEUE_H
  3 
  4 #include<stdio.h>
  5 #include<stdlib.h>
  6 
  7 #define ALLOC_SIZE 512
  8 #define ElemType int
  9 
 10 typedef struct sqstack
 11 {
 12     ElemType *top;          //    
 13     ElemType *base;         //    
 14     int stack_size;    //           
 15 }SqStack;                //   
 16 
 17 typedef struct sqqueue
 18 {
 19     SqStack front;          //   ,  ,
 20     SqStack rear;           //
 21 }SqQueue;
 22 
 23 /*       */
 24 void InitStack(SqStack *s)
 25 {
 26     if((s->top=(ElemType*)malloc(ALLOC_SIZE*sizeof(ElemType)))==NULL)
 27     {
 28         printf("stack malloc error
"); 29 exit(1); 30 } 31 s->base=s->top; 32 s->stack_size=ALLOC_SIZE; 33 } 34 35 /* , 0, 1*/ 36 int pop_stack(SqStack *s,ElemType *data) 37 { 38 if(s->top!=s->base) 39 { 40 s->top--; 41 *data=*s->top; 42 return 1; 43 } 44 else // 0, 45 { 46 return 0; 47 } 48 } 49 50 /* */ 51 void push_stack(SqStack *s,ElemType data) 52 { 53 if((s->top-s->base)>=s->stack_size) 54 { 55 if((s->base=(ElemType *)realloc(s->base,(s->stack_size+ALLOC_SIZE)*sizeof(ElemType)))==NULL) 56 { 57 printf("stack realloc error
"); 58 exit(1); 59 } 60 else 61 { 62 s->top=s->base+s->stack_size; 63 s->stack_size+=ALLOC_SIZE; 64 } 65 } 66 *(s->top)=data; 67 s->top++; 68 } 69 70 /* */ 71 void InitQueue(SqQueue *q) 72 { 73 SqStack A,B; 74 75 InitStack(&A); 76 InitStack(&B); 77 q->front=B; // B 78 q->rear=A; // A 79 } 80 81 /* */ 82 void push_queue(SqQueue *q,ElemType data) 83 { 84 push_stack(&q->rear,data); 85 } 86 87 /* , 0, 1*/ 88 int pop_queue(SqQueue *q,ElemType *data) 89 { 90 if((pop_stack(&q->front,data))==0) // 91 { 92 while((pop_stack(&q->rear,data))!=0) 93 { 94 push_stack(&q->front,*data); 95 } 96 } 97 else // , 1 98 { 99 return 1; 100 } 101 if((pop_stack(&q->front,data))==0) // 102 { 103 return 0; 104 } 105 else 106 { 107 return 1; 108 } 109 } 110 #endif

2. 주 함수: main. c: 테스트 용 으로 만 for 순환 을 통 해 1000 개의 수 0 - 999 를 대기 열 에 넣 고 인쇄 합 니 다.
 1 #include<stdio.h>
 2 #include"stack_to_queue.h"
 3 
 4 int main()
 5 {
 6     SqQueue q;
 7     int i,data;
 8 
 9     InitQueue(&q);
10     for(i=0;i<1000;i++)
11     {
12         push_queue(&q,i);
13     }
14     while((pop_queue(&q,&data))!=0)
15     {
16         printf("%d  ",data);
17     }
18 
19     return 0;
20 }

전에 썼 을 때 실 수 를 했 어 요. stackto_quue. h 의 62 줄 은 realloc 함 수 를 사용 하여 메모 리 를 재배 치 한 후에 top 포인터 도 새로운 위 치 를 가리 키 려 고 합 니 다. 저 는 이 단 계 를 빠 뜨 려 서 실 수 를 했 습 니 다. 오랫동안 검 사 했 습 니 다. 마지막 해결 과정 은 다음 과 같 습 니 다. http://q.cnblogs.com/q/54337/

좋은 웹페이지 즐겨찾기