剑指offer-面试题7:俩个栈实现队列(c)
首先要清楚栈和队列的数据接口和各自的特点,栈:FILO,队列FIFO,运用俩个栈,栈1FILO,再将数据存入栈2又是FILO,因而从整体输入来看,在栈2中表现为FIFO
主要思想如下:
(1)在队列中定义俩个栈stack1,stcak2,stack1用于做队列数据存入栈,stack2做队列数据输出栈
(2)数据进入存入栈stack1,
(3)执行队列输出时首先检测stack2中是否存在数据,如果有直接从stack2中弹出即可(经历了stack1的FILO和stack2的FILO,从原始输入到stack2数据存放顺序表现“FIFO”和队列一致了)
(4)如果stack2中没有数据则将stack1中的数据依次入栈到stack2中
期间要注意一些安全性的检查
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 /* 5 *剑指offer Pro7 6 *俩个链表实现队列操作 7 */ 8 9 /*定义顺序栈结构定义和操作*/ 10 #define LEN 100 11 typedef struct 12 { 13 char data[LEN];//假设栈内元素为字符型 14 int top; //栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置 15 }Stack,*StackPoint; 16 /*定义栈的一些操作函数*/ 17 //栈的初始化 18 StackPoint InitStack() 19 { 20 //开辟节点 21 StackPoint stack = (StackPoint)malloc(sizeof(Stack)); 22 //分配空间之后记得安全性检查 23 if(stack==NULL) 24 { 25 printf("分配内存错误\n"); 26 return NULL; 27 } 28 //内存分配成功则将栈顶指针赋值,初始值为-1 29 stack->top = -1; 30 //返回此时的节点指针 31 return stack; 32 } 33 //栈空判断函数 34 int isEmptyStack(StackPoint stack) 35 { 36 if(stack->top==-1) 37 return 1; 38 else 39 return 0; 40 } 41 //进栈函数 42 int push(StackPoint stack,char c) 43 { 44 //安全性检测 45 if(stack->top>=(LEN-1)) 46 { 47 printf("对不起,栈已满\n"); 48 return 0; 49 } 50 /*正常情况进栈操作,注意此时入栈的位置*/ 51 stack->data[stack->top+1] = c;//元素入栈 52 stack->top++;//栈位置指示递增 53 return 1; 54 } 55 //出栈操作 56 int pop(StackPoint stack,char *c) 57 { 58 //安全性检查 59 if(isEmptyStack(stack)) 60 { 61 printf("对不起此时已经栈空,无法弹出元素!\n"); 62 return 0; 63 } 64 /*出栈操作*/ 65 *c = stack->data[stack->top]; 66 stack->top--; 67 return 1; 68 } 69 70 /*队列定义及操作*/ 71 //定义队列结构 72 typedef struct 73 { 74 //队列里面放置俩个栈 75 StackPoint stack1,stack2; 76 }Queue,*QueuePoint; 77 //元素入队列 78 int insertQueue(QueuePoint queue,char c) 79 { 80 //安全性检查 81 if((queue->stack1)->top==(LEN-1)) 82 { 83 printf("队列已满/n"); 84 return 0; 85 } 86 printf("%c\n",c); 87 //将元素压入队列,如不成功则返回 88 if(!push(queue->stack1,c)) 89 { 90 printf("队列插入出错!\n"); 91 return 0; 92 } 93 return 1; 94 } 95 //从队列出元素 96 char outputQueue(QueuePoint queue) 97 { 98 /*元素出队列首先判断stack2是否为空,不为空直接从stack2出栈,否则将 99 stack1中的数全部依次出栈到stack2,然后再将stack2出栈*/ 100 char c; 101 if(queue->stack2->top<0) 102 { 103 //将stack1中的数据全部出栈到stack2中 104 while(queue->stack2->top<(LEN-1) && queue->stack1->top>=0) 105 { 106 pop(queue->stack1,&c); 107 push(queue->stack2,c); 108 } 109 110 } 111 if(queue->stack2->top==-1) 112 { 113 printf("这是空队列!\n"); 114 return 0; 115 } 116 //从stack2正常弹出 117 pop(queue->stack2,&c); 118 return c; 119 } 120 //创建一个队列 121 QueuePoint createQueue() 122 { 123 QueuePoint queue = (QueuePoint)malloc(sizeof(Queue)); 124 //初始化栈 125 queue->stack1 = InitStack(); 126 queue->stack2 = InitStack(); 127 //安全性检查 128 if(!queue->stack1) return NULL; 129 if(!queue->stack2) return NULL; 130 //返回头地址 131 return queue; 132 } 133 134 135 136 137 int main(int argc,char *argv[]) 138 { 139 QueuePoint queue = createQueue(); 140 if(queue==NULL) 141 { 142 printf("队列创建失败\n"); 143 return 1; 144 } 145 insertQueue(queue,'x'); 146 insertQueue(queue,'s'); 147 insertQueue(queue,'f'); 148 printf("queue output %c\n",outputQueue(queue)); 149 insertQueue(queue,'m'); 150 insertQueue(queue,'d'); 151 insertQueue(queue,'x'); 152 printf("queue output %c\n",outputQueue(queue)); 153 printf("queue output %c\n",outputQueue(queue)); 154 printf("queue output %c\n",outputQueue(queue)); 155 printf("queue output %c\n",outputQueue(queue)); 156 printf("queue output %c\n",outputQueue(queue)); 157 //printf("结构大小%d",sizeof(Stack)); 158 return 0; 159 }