剑指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 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
随机推荐
- [HNOI 2009]有趣的数列
Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…&l ...
- [POI2006]ORK-Ploughing
Description Byteasar想耕种他那块矩形的田,他每次能耕种矩形的一边(上下左右都行),在他每次耕完后,剩下的田也一定是矩形,每块小区域边长为1,耕地的长宽分别为m和n,不幸的是Byte ...
- bzoj 3998: [TJOI2015]弦论
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
- Codeforces 2B. The least round way
There is a square matrix n × n, consisting of non-negative integer numbers. You should find such a w ...
- Luogu1613 跑路
题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟 ...
- Linux之grep命令
概述 所有的类linux系统都会提供一个名为grep(global regular expression print,全局正则表达式输出)的搜索工具.grep命令在对一个或多个文件的内容进行基于模式的 ...
- 垃圾回收机制(GC)
垃圾收集器(GC)与内存分配策略 GC需要完成的三件事: 判断哪些内存需要回收 什么时候回收 如何回收 在java内存运行时区域的各个部分中,程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程 ...
- Java内存分配、管理小结
转载自:http://java-mzd.iteye.com/blog/848635
- 使用Aes对称加密解密Web.Config数据库连接串
现在很多公司开始为了保证数据库的安全性,通常会对Web.Config的数据库连接字符串进行加密.本文将介绍学习使用Aes加密解密数据库连接字符串.本文采用MySql数据库. AES概念简述 AES 是 ...
- Mysql优化--Show Profile
Mysql 系列文章主页 =============== 是Mysql提供可以用来分析当前会话中语句执行的资源消耗情况.可以用于Sql的调优的测量.默认情况下处于关闭状态,并保存最近 15 次的运行结 ...