数据接口复习 3 stack and queue
stack:
1.top and bottom.统一在top端增加和删除。
Attention:
函数 delete(x) 是将top端的元素删除并且赋值给x
实现:通过linked list实现 。
public class StackLi { public StackLi( ){ topOfStack = null; } public boolean isFull( ){ return false; } public boolean isEmpty( ){ return topOfStack = = null; } public void makeEmpty( ){ topOfStack = null; } public void push( object x ) public object top( ) public void pop( ) throws Underflow public object topAndPop( ) private ListNode topOfStack; }
通过数组实现。
主要的应用:用于进行括号的匹配 尝试编程中因为之前没有怎么用过stack
主要用到的几个方法: add(x),pop(),firstelement()
public void testMatch(String expression){matchstack=new Stack<Integer>();int len=expression.length();for(int i=0;i<len;i++){char getCh=expression.charAt(i);if(getCh=='('){matchstack.add(i); }else if(getCh==')'){try{matchstack.pop();}catch(Exception e){System.out.println(i+"missing 左括号");}}}while(!matchstack.isEmpty()){System.out.println(matchstack.firstElement()+"missing 右括号");matchstack.pop();}}
表达式:infix expression中缀表达式,也就是我们正常意义上理解的。
posfix expression 后缀表达式 prefix expression 前缀表达式
后缀表达式---->中缀表达式
具体的算法见表达式转换随笔。。
queue:
first in -first out 增加和删除在不同头。
rear增加端 front删除端
数组实现:
删除时有两种方法:
1.直接将头部的坐标修改:front=front+1; O(1) 但是会占用大量的空间
2.将元素将左移动。O(n)
解决1:使用环形的数组。
使用链表实现:摘自别的博客
#include <stdio.h> #include <stdlib.h>#define Error( str ) FatalError( str ) #define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 )typedef int ElementType; #define MAXQUEUE 10typedef struct node {ElementType data;struct node* nextNode; } Node; typedef struct queue {Node* front; // 对首指针Node* rear; // 队尾指针int items; // 队列中项目个数 } *ptrQueue; typedef ptrQueue Queue; int IsEmpty(Queue q); int IsFull(Queue q); Queue CreateQueue(void); void DisposeQueue(Queue q); void MakeEmpty(Queue q); void Enqueue(ElementType x, Queue q); ElementType Front(Queue q); void Dequeue(Queue q); ElementType FrontAndDequeue(Queue q);/************************************************************************/ // 主程序 /************************************************************************/ int main(void) {Queue sqQueue;//int maxElements = 10; sqQueue = CreateQueue();if (IsEmpty(sqQueue))printf("创建了空队列!");int value = 0;printf("队列中的数据为(front->rear):\n");while (!IsFull(sqQueue)){Enqueue(value*value, sqQueue); // 入队printf("%d ", value*value);value++;}printf("队列已满\n");ElementType frontQueue;frontQueue = Front(sqQueue);printf("对头元素为:%d\n", frontQueue);Dequeue(sqQueue);frontQueue = Front(sqQueue);printf("执行出队操作Dequeue之后,对头元素是:%d\n", frontQueue);DisposeQueue(sqQueue);return 0; }/************************************************************************/ // 是否为空 /************************************************************************/ int IsEmpty(Queue q) {int size=q->items;return size==0; }/************************************************************************/ // 是否已满 /************************************************************************/ int IsFull(Queue q) {int size=q->items;return size>=MAXQUEUE; }/************************************************************************/ // 创建队列 /************************************************************************/ Queue CreateQueue(void) {Queue q;q=(Queue)malloc(sizeof(struct queue));if(q==NULL){Error("空间不足");}q->front=(Node*)malloc(sizeof(struct node));if(q->front==NULL ){Error("对首失败");}q->rear=(Node*)malloc(sizeof(struct node));if(q->rear==NULL ){Error("对首失败");}q->items=0;return q; }/************************************************************************/ // 释放队列 /************************************************************************/ void DisposeQueue(Queue q) {MakeEmpty(q);free(q); }/************************************************************************/ // 使队列为空 /************************************************************************/ void MakeEmpty(Queue q) {if (q == NULL)Error("必须先使用CreateQueue创建队列!");while (!IsEmpty(q))Dequeue(q); }/************************************************************************/ // 入对 /************************************************************************/ void Enqueue(ElementType x, Queue q) {if (IsFull(q))Error("队列已满!");Node* pnode;pnode = (Node*)malloc(sizeof(Node));if (NULL == pnode)Error("新节点分配内存失败!");pnode->data= x;pnode->nextNode = NULL;if (IsEmpty(q))q->front = pnode; // 项目位于首端elseq->rear->nextNode = pnode; // 链接到队列尾端q->rear = pnode; // 记录队列尾端的位置q->items++; // 项目数加1return; }/************************************************************************/ // 出对 /************************************************************************/ void Dequeue(Queue q) {if (IsEmpty(q))Error("队列本身为空!");Node* pnode;pnode = q->front;q->front = q->front->nextNode;free(pnode);q->items--;if (q->items == 0)q->rear = NULL;return; }/************************************************************************/ // 返回对列头元素 /************************************************************************/ ElementType Front(Queue q) {if (!IsEmpty(q))return q->front->data;Error("队列为空\n");return 0; }/************************************************************************/ // 返回对列头元素并使对头元素出对 /************************************************************************/ ElementType FrontAndDequeue(Queue q) {ElementType x = 0;if( IsEmpty(q) )Error( "队列为空!" );else{q->items--;x = q->front->data;q->front = q->front->nextNode;}return x; }
应用:
1.打印多米诺
public static void printBinomial(int n){Queue<Integer>queues=new LinkedList();queues.add(1);queues.add(1);int s=0;for(int i=1;i<=n;i++){System.out.println("");for(int j=i;j<=10-i;j++){System.out.print(" ");}queues.add(0);for(int k=1;k<=i+2;k++){int t=queues.poll();queues.add(s+t);s=t;if(k!=i+2){System.out.print(s+" ");}}}}
算法:插入一个0 110 --->1210----->13310----->
2.wire routing
详解参加wire routing
转载于:https://www.cnblogs.com/bounceFront/p/5514714.html
数据接口复习 3 stack and queue相关推荐
- stack、queue、priority_queue
容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口. 其中stack和queue都是 ...
- C++STL详解(六)——stack和queue
文章目录 空间适配器 stack stack的定义方式 stack的使用 stack的模拟实现 queue queue的定义方式 queue的使用 queue的模拟实现 浅谈deque容器 deque ...
- 6-5-1:STL之stack和queue——stack和queue的快速入门、常用接口以及适配器的概念
文章目录 一:简单介绍 (1)stack (2)queue 二:stack和queue的应用 三:stack和queue的模拟实现--适配器 一:简单介绍 stack和queue是STL中的两个容器, ...
- C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)
除了vector,list,deque等常用的容器,还有根据这些常用的容器进行改造来满足特殊要求的容器,这些特殊容器的行为和常用容器很相近,也称为容器适配器. 常用的容器适配器有三个,分别是stack ...
- C++ STL : 模拟实现STL中的容器适配器stack和queue
目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...
- C++中的deque、stack、queue及priority_queue
C++中的deque.stack.queue及priority_queue 文章目录 C++中的deque.stack.queue及priority_queue 一.deque 二.stack 三.q ...
- java中List、Map、Set、Collection、Stack、Queue等的使用
java中这几个东西是比较常用的,虽然我用的不多,也正是因为用的不多,所以我一直搞不清楚他们之间的具体用法以及相互之间的关系,现在特单独作为一个东西来总结一下. 本文参考一下资料: 1.<jav ...
- Stack与queue的底层实现、区别。
一.stack(栈):先进后出 1.栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构. 栈的开口端被称为栈顶:相应地,封口端被称为栈底. 向栈中添加元素,此过 ...
- C++---容器适配器(stack、queue、priority_queue)
容器适配器 首先我们要知道容器适配器是干啥的. 我们可以简单的将容器适配器当做一个接口装置.有的电脑上没有数据转接口,但是有usb接口,这是我们没必要重新买一个电脑,我们可以做一个usb数据转接线.而 ...
- stack和queue容器
stack容器 stack是一种先进后出的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 栈可以判断是否为空 empty() 栈可以返回元素个数 size() 入 ...
最新文章
- 用Cordova打包Vue-vux项目
- 苹果系统修复若干办法
- 前端面试instanceof_一起回归一下每日一题这些经典面试题
- winform TreeView 节点选择
- python中pickle模块的用法_Python中json模块和pickle模块的简单介绍(附示例)
- mysql2014授权设置_mysql权限管理(2014-09-15)
- c语言多线程_马云都称赞的C语言、C++学习路线!!!!
- jQuery 插件写法
- FileZilla Server远程管理
- 三维点云数据处理软件供技术原理说明_十大点云数据处理技术梳理
- python游戏编程入门百度云-《Python游戏编程快速上手》PDF下载|百度云盘
- 武汉大学计算机学院推免率,武汉大学保研率
- 个人银行账户管理程序(C++)
- “云原生”技术公开课第3章:Kubernetes 核心概念
- gantt客制化gantt 图标
- uni-app使用Hbuilder X如何苹果手机IOS打包、发布、运行
- 帆软报表,异常问题汇总
- JQuery原理解析
- ping命令的几个简单使用
- 硬盘的种类、区别、运行原理
热门文章
- Visitor Pattern
- 芯片国产化进程提速 赶超洋品牌核心技术尚欠火候
- 《云数据中心构建实战:核心技术、运维管理、安全与高可用》——2.4 云计算的发展历程与未来趋势...
- Android入门(三)Activity-生命周期与启动模式
- python-unicode十进制数字转中文
- 用PS设计等高线效果的背景图片
- 在android 采用 android junit test 测试注意
- How Do I? Videos for Devices
- 旅游后台管理系列——使用maven tomcat插件启动web工程
- [USACO DEC13] 名称记录