首先要清楚栈和队列的数据接口和各自的特点,栈: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)); ; }