剑指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 4945: [Noi2017]游戏
Description Solution 首先我们发现一个位置如果不是 \('x'\),那么就只有两种选择 而 \('x'\) 的个数小于等于 \(8\),直接枚举是哪个就好了 然后就是 \(2-sa ...
- codevs3990:中国剩余定理2
好久没做codevs啦 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cst ...
- ●BZOJ 4008 [HNOI2015]亚瑟王
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4008题解: 概率dp,神仙题 如果我们可以求出每种牌被取到的概率f,那么最后期望造成的伤害也 ...
- 【luogu2161】【SHOI2009】Booking会场预约
原题传送门 题意简析:你需要写一个数据结构,维护一个时间轴,支持如下操作: 1)插入1个新区间,删除所有时间轴上与它有交的区间并输出个数. 2)查询当前时间轴上的区间个数. 解题思路:裸的无旋trea ...
- xml 和数组的相互转化
数组转化为xml: function arrtoxml($arr,$dom=0,$item=0){ if (!$dom){ $dom = new DOMDocument("1.0" ...
- 5-15 QQ帐户的申请与登陆 (25分) HASH
实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数NN(\le 10^5≤105),随后给出NN行指令.每行指令的格 ...
- 阿里技术一面,Java研发岗
之前过了个简单的简历面,过了几天后没打来以为凉了,然后昨晚又接到了电话,括号内容是回答说的,理解有限,不一定都对,欢迎纠正-加油每一个牛友们! 阿里一面: 1.学过哪些技术知识呢? 2.说说接口和抽象 ...
- 07_Linux目录文件操作命令4解压缩,文件查找_我的Linux之路
这一节还是一样学习操作目录文件的命令 在这一节,我会讲到解压压缩tar以及zip命令,以及文本查找命令grep tar 打包压缩命令 tar命令可以为linux的文件和目录创建档案 首先要弄清两个概念 ...
- Mybatis自动生成实体类和实体映射工具
Mybatis Mysql生成实体类 用到的Lib包: mybatis-generator-core-1.3.2.jarmysql-connector-java-5.1.30.jar 1. 创建一个文 ...
- JavaScript正则表达式模式匹配(6)——常用的正则表达式
1.检查邮政编码 var pattern=/[1-9][0-9]{5}/; // 必须是6位,必须是数字,第一位不能为0 var str='274200'; alert(pattern.test(st ...