剑指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中
期间要注意一些安全性的检查
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 /*
 *剑指offer Pro7
 *俩个链表实现队列操作
 */
 /*定义顺序栈结构定义和操作*/
 #define LEN 100
 typedef struct
 {
     char data[LEN];//假设栈内元素为字符型
      int top; //栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置
 }Stack,*StackPoint;
 /*定义栈的一些操作函数*/
 //栈的初始化
 StackPoint InitStack()
 {
     //开辟节点
     StackPoint stack = (StackPoint)malloc(sizeof(Stack));
     //分配空间之后记得安全性检查
     if(stack==NULL)
     {
         printf("分配内存错误\n");
         return NULL;
     }
     //内存分配成功则将栈顶指针赋值,初始值为-1
     stack->top = -;
     //返回此时的节点指针
     return stack;
 }
 //栈空判断函数
 int isEmptyStack(StackPoint stack)
 {
     )
         ;
     else
         ;
 }
 //进栈函数
 int push(StackPoint stack,char c)
 {
     //安全性检测
     ))
     {
         printf("对不起,栈已满\n");
         ;
     }
     /*正常情况进栈操作,注意此时入栈的位置*/
     stack->data[stack->top+] = c;//元素入栈
     stack->top++;//栈位置指示递增
     ;
 }
 //出栈操作
 int pop(StackPoint stack,char *c)
 {
     //安全性检查
     if(isEmptyStack(stack))
     {
         printf("对不起此时已经栈空,无法弹出元素!\n");
         ;
     }
     /*出栈操作*/
     *c = stack->data[stack->top];
     stack->top--;
     ;
 }
 /*队列定义及操作*/
 //定义队列结构
 typedef struct
 {
     //队列里面放置俩个栈
     StackPoint stack1,stack2;
 }Queue,*QueuePoint;
 //元素入队列
 int insertQueue(QueuePoint queue,char c)
 {
     //安全性检查
     ))
     {
         printf("队列已满/n");
         ;
     }
     printf("%c\n",c);
     //将元素压入队列,如不成功则返回
     if(!push(queue->stack1,c))
     {
         printf("队列插入出错!\n");
         ;
     }
     ;
 }
 //从队列出元素
 char outputQueue(QueuePoint queue)
 {
     /*元素出队列首先判断stack2是否为空,不为空直接从stack2出栈,否则将
     stack1中的数全部依次出栈到stack2,然后再将stack2出栈*/
     char c;
     )
     {
         //将stack1中的数据全部出栈到stack2中
         ) && queue->stack1->top>=)
         {
             pop(queue->stack1,&c);
             push(queue->stack2,c);
         }
     }
     )
     {
         printf("这是空队列!\n");
         ;
     }
     //从stack2正常弹出
     pop(queue->stack2,&c);
     return c;
 }
 //创建一个队列
 QueuePoint createQueue()
 {
     QueuePoint queue = (QueuePoint)malloc(sizeof(Queue));
     //初始化栈
     queue->stack1 = InitStack();
     queue->stack2 = InitStack();
     //安全性检查
     if(!queue->stack1) return NULL;
     if(!queue->stack2) return NULL;
     //返回头地址
     return queue;
 }
 int main(int argc,char *argv[])
 {
     QueuePoint queue = createQueue();
     if(queue==NULL)
     {
         printf("队列创建失败\n");
         ;
     }
     insertQueue(queue,'x');
     insertQueue(queue,'s');
     insertQueue(queue,'f');
     printf("queue output %c\n",outputQueue(queue));
     insertQueue(queue,'m');
     insertQueue(queue,'d');
     insertQueue(queue,'x');
     printf("queue output %c\n",outputQueue(queue));
     printf("queue output %c\n",outputQueue(queue));
     printf("queue output %c\n",outputQueue(queue));
     printf("queue output %c\n",outputQueue(queue));
     printf("queue output %c\n",outputQueue(queue));
     //printf("结构大小%d",sizeof(Stack));
     ;
 }
剑指offer-面试题7:俩个栈实现队列(c)的更多相关文章
- 剑指offer 05:用两个栈实现队列
		题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题代码 import java.util.Stack; public class Solution{ ... 
- 剑指offer五之用两个栈实现队列
		一.题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 二.思路 1.Push操作:将数据直接压入stack1即可 2.Pop操作:将stack1中的数据全部弹 ... 
- 《剑指Offer》-005 -用两个栈实现队列
		如题 (总结要点) 用两个栈实现队列 栈; 先进后出 队列: 先进先出 两个栈, 相等于两个杯子; 把一本水倒来倒去, 取到杯子底部的元素,并且删除,再倒回去 原文链接 : 借鉴学习文章列表 链接1: ... 
- 【剑指 Offer】09.用两个栈实现队列
		题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead , 分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ... 
- 剑指offer:JZ9 用两个栈实现队列
		JZ9 用两个栈实现队列 描述 用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能. 队列中的元素为int类型.保证操作合法,即保 ... 
- 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ... 
- 剑指Offer系列_09_用两个栈实现队列
		package leetcode.sword_to_offfer.day01; import java.util.LinkedList; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两 ... 
- 剑指offer面试题3  二维数组中的查找(c)
		剑指offer面试题三: 
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
		问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ... 
- 剑指Offer——笔试题+知识点总结
		剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ... 
随机推荐
- ●BZOJ 1416 [NOI2006]神奇的口袋
			题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1416题解: Pòlya瓦罐模型: 给定罐子里每种颜色的球的个数A[i],按题目要求随机操作若 ... 
- POJ2135:Farm Tour
			题意:给定一个无向图,从1走到n再从n走回1,每个边只能走一遍,求最短路 题解:可以定义一个源点s,和一个汇点t s和1相连容量为2,费用为0, t和n相连容量为2,费用为0 然后所用的边的容量都定为 ... 
- 【NOIP 2017】逛公园
			Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要 ... 
- 【Uva 11280 飞到弗雷德里顿】
			·你可以尽情地坐飞机,但停留次数遭到限制. ·英文题,述大意: 给出一张有向图,起点是输入的第一个城市,终点是输入的最后一个城市.给出q个询问,每个询问含一个t,表示 #include&l ... 
- Linux 基本概念和操作
			我们在使用Linux时,不是直接和系统打交道,而是通过shell的中间程序.在图形界面下为了实现窗口的输入和输出,linux系统为我们提供了终端模拟器Terminal,常见的终端模拟器有 gnome- ... 
- java底层学习
			额,马上就要面试了,Java的底层肯定是需要了解的.网上找了找java的底层文章,做个记号.java底层主要是类的加载.连接和初始化. 本文主要分为四个方面: (1)java底层概述 (2)new和n ... 
- 不能执行已经释放掉的Script代码!(已解决)
			发生原因: 当页面关闭时 会释放掉该页面的JS 解决方法: 在 js onload方法中执行容错判断, 如果该JS文件中任意对象为空的话,则动态加载该JS文件. window.onload = fun ... 
- webpack 4 + mockjs
			一.创建项目目录 二.添加开发依赖( html-webpack-plugin.webpack.webpack-cli.webpack-dev-server.webpack-api-mocker) 如下 ... 
- seaborn使用(绘图函数)
			seaborn使用(绘图函数) 数据集分布的可视化 分类数据的绘图 线性关系可视化 一.数据集分布的可视化 distplot kdeplot rugplot 1.distplot() 灵活的绘制单变量 ... 
- Android查缺补漏(线程篇)-- IntentService的源码浅析
			本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8975114.html 在Android中有两个比较容易弄混的概念,Servic ... 
