剑指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 }

 

转载于:https://www.cnblogs.com/xsfelvis/p/4398419.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值