java使用隊列實現棧思路_算法面試:隊列實現棧的方案

聲明:碼字不易,轉載請注明出處,歡迎文章下方討論交流。

前言:Java數據結構與算法專題會不定時更新,歡迎各位讀者監督。本篇介紹的是如何用兩個隊列實現棧的問題。這道題作為上一篇文章算法面試:棧實現隊列的方案的姊妹篇(也是一道思路拓展題),本文給出問題的解決思路和Java實現代碼。

首先定義兩個隊列分別為queue1和queue2。

1.大體思路:

隊列實現棧,棧的特點是后進的先出,我們可以讓元素入隊queue1,留下隊尾元素讓其他元素出隊,暫存到queue2中,然后讓queue1中剩下的元素出隊,即最后進的最先出來。

2.基本解決方案

按照上述的大體思路,我們給出解決方案:入棧和出棧都在queue1中完成,queue2只作為臨時中轉空間。

入棧 入隊queue1

出棧 除queue1隊尾的元素外將其他所有元素出隊queue1,再入隊queue2(中轉暫存),然后將queue1中的元素出隊(出棧)。最后一步,將暫存在queue2中的元素再倒回queue1中。

為描述清晰,請看下圖:295c18eefe93565711ad1aef460de2c6.png

事實上,這個思路和用兩個棧實現隊列的方案1類似,都是第二個數據區作為暫存中轉,最后在倒回到第一個數據區。

3.改進后的方案

上述方案是一個基本的最容易想到的解決方案,但是仔細觀察會發現其并不完美:在每次出棧步驟中要把queue2中的元素倒回到queue1中,這個操作很累贅,能否優化一下,可不可以不用每次先出棧后倒回??下面給出改進后的方案

入棧:

兩個隊列全空:任選一個隊列讓元素入隊,此處規定queue1

兩個隊列一個空:讓元素入隊非空的隊列

注:不考慮兩個隊列全滿,因為本身沒意義

出棧: 將非空隊列中除最后入隊的元素之外的其他所有元素入隊到另外一個隊列中,然后出隊剩下的那個元素(后進來的先出去,完成出棧)

相比于基本方案,改進后的方案沒有了基本方案中的倒回操作,整個流程變得簡潔高效,下面給出改進方案的java代碼實現。

4.java代碼實現

public class Queues2Stack {

private ArrayQueue q1;

private ArrayQueue q2;

private int maxLength;

public Queues2Stack(int capacity){

maxLength = capacity;

q1 = new ArrayQueue(capacity);

q2 = new ArrayQueue(capacity);

}

public int getSize(){

return q1.getsize()+q2.getsize();

}

/**

* 入棧:

* @param element 入棧元素

* @return 入棧成功結果?

*/

public boolean push(int element){

if(getSize() == maxLength){ //隊列都滿,此情景無意義

return false;

}

if(q2.isEmpty()){

q1.put(element);

}else{

q2.put(element);

}

return true;

}

/**

* 出棧

* @return 出棧元素

*/

public Object pop(){

if(getSize()==0){

throw new IndexOutOfBoundsException("空棧,無元素可出棧");

}else{ //留非空隊列中最后一個元素,其他搬到空隊列中

if(q2.isEmpty()){

while(q1.getsize()>1) q2.put(q1.pull());

return q1.pull(); //出隊最后一個,實現后進先出

}else{

while(q2.getsize()>1) q1.put(q2.pull());

return q2.pull(); //出隊最后一個,實現后進先出

}

}

}

}

測試程序:

public class Queues2StackTest {

public static void main(String[] args) {

Queues2Stack s = new Queues2Stack(5);

s.push(1);

s.push(2);

s.push(3);

System.out.println(s.pop()); //返回3

s.push(4);

s.push(5);

System.out.println(s.pop()); //返回5

System.out.println(s.pop()); //返回4

System.out.println(s.pop()); //返回2

System.out.println(s.pop()); //返回1

System.out.println(s.pop()); //拋出異常:提示棧為空

}

}

本篇的姊妹篇請移步到之前的文章算法面試:棧實現隊列的方案

歡迎討論提問,覺得文章對您有用,請收藏點個贊 ^_^

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539603.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Uber如何使用go語言創建高效的查詢服務

在2015年初我們創建了一個微服務,它只做一件事(也確實做得很好)就是地理圍欄查詢。一年后它成了Uber高頻查詢(QPS)服務,本次要講的故事就是我們為什么創建這個服務,以及編程語言新秀Go如何幫我們…

centos7:塔建pure_ftpd虛擬用戶

2019獨角獸企業重金招聘Python工程師標準>>> 1.下載pure_ftpd,上傳服務器,目錄路徑:/usr/local/src/ 下載地址:https://pan.baidu.com/s/1kWe8FAn 2.安裝pure_ftpd cd /usr/local/srctar -xjf pure-ftpd-1.0.36.tar.bz2cd pure-ftpd-1.0.36./configure -…

java.lang.module_如何修復“java.lang.module.FindException:module java.se.ee not found”錯誤

我正在嘗試打包我的kivy應用程序(python3),但是當我運行命令buildozer -v android debug時,看到這個錯誤# Cwd /home/javier/.buildozer/android/platform/android-sdkError occurred during initialization of boot layerjava.lang.module.FindExceptio…

寒武紀芯片——有自己的SDK,支持tf、caffe、MXNet

寒武紀芯片產品中心>智能處理器IP智能處理器IP MLU智能芯片 軟件開發環境 Cambricon-1A 高性能硬件架構及軟件支持兼容Caffe、Tensorflow、MXnet等主流AI開發平臺,已多次成功流片 國際上首個成功商用的深度學習處理器IP產品,可廣泛應用于計算機視覺、…

maven ssm框架 mysql_SSM框架(IDEA+Spring+SpringMVC+Maven+Mybatis+MySQL)

【實例簡介】SSM框架(IDEASpringSpringMVCMavenMybatisMySQL),搭建SSM框架,利用mybatis-plus插件自動生成數據庫相關代碼。【實例截圖】【核心代碼】0d399d99-f108-4aaa-9c81-35b505c86e8a└── SSMManager├── pom.xml├── sql│ └── test.sql└── src…

spring框架的引入

spring框架給程序開發帶來了春天,在很多項目里,可能不用struts,不用hibernate,但往往都有spring。 why? 因為每個項目都會涉及到對象的創建和對象之間的依賴。 一、傳統的MVC開發 mvc的項目框架結構:Enti…

Java編程作業體會_Java作業的幾點總結感想

本次博客主要是總結近幾次作業,交流一下自己的感受。本次作業主要是對近幾次Java課程的鞏固作業,第一次作業主要是一些基礎的題目,包括選擇循環等一些基本語句,其目的在于掌握java一些基本知識,感受出Java與其他語言有…

基于百度語音識別API的Python語音識別小程序

一、功能概述 實現語音為文字,可以擴展到多種場景進行工作,這里只實現其基本的語言接收及轉換功能。 在語言錄入時,根據語言內容的多少與停頓時間,自動截取音頻進行轉換。 工作示例: 二、軟件環境 操作系統&#xff1a…

spring專業術語了解

組件/框架設計 侵入式設計 引入了框架,對現有的類的結構有影響;即需要實現或繼承某些特定類。 例如:Struts框架 非侵入式設計 引入了框架,對現有的類結構沒有影響。 例如:Hibernate框架 / Spring框架 控制反轉: In…

java修改ldap用戶密碼_LDAP 用戶更改自己的密碼

LDAP中采用了ACL的權限控制。在/etc/openldap/slapd.conf文件中:## See slapd.conf(5) for details on configuration options.# This file should NOT be world readable.#include/etc/openldap/schema/corba.schemainclude/etc/openldap/schema/core.schemainclud…

Spring第三篇【Core模塊之對象依賴】

tags: Spring 前言 在Spring的第二篇中主要講解了Spring Core模塊的使用IOC容器創建對象的問題,Spring Core模塊主要是解決對象的創建和對象之間的依賴關系,因此本博文主要講解如何使用IOC容器來解決對象之間的依賴關系! 回顧以前對象依賴 我…

spring框架結構介紹

Spring提供了一站式解決方案: 1) Spring Core spring的核心功能: IOC容器, 解決對象創建及依賴關系 2) Spring Web Spring對web模塊的支持。 -->可以與struts整合,讓struts的action創建交給spring -->spring mvc模式 3…

java通過J2C獲取用戶名密碼_WAS服務器上的J2C別名有什么用途?

這是我LdapTemplate類 公共LdapTemplate getLdapTemplete(字符串ldapID) {WAS服務器上的J2C別名有什么用途?if (ldapID.equalsIgnoreCase(Constants.LDAP1)){if (ldapTemplate1 null){try{PasswordCredential passwordCredential j2cAliasUtility.getAliasDetails…

百度坐標轉換API使用

http://api.map.baidu.com/geoconv/v1/?coords121.54759,29.870724&from1&to5&aksGSOaO07WkRHHiCRxxbSQVBn 前提:121.54759,29.870724 是由手機硬件或谷歌地圖獲取的 錯誤的方法一: function standard2china(lng,lat){//http://api.map.ba…

Java語言所有異常類均繼承自_Java將運行錯誤分為兩類:(__)和(__), 其對應的類均派生自(__)類;...

【單選題】設 x,y 均為已定義的類名,下列聲明對象x1的語句中正確的是( )【判斷題】構造函數的方法名可以由編程人員任意命名。【單選題】能夠實現對原文的鑒別和不可否認性的認證技術是( )。【單選題】設有定義語句int a[]{66,88,99}; 則以下對此語句的敘述錯誤的是( )。【判斷…

Quartz業務類無法注入Spring對象問題

tags: 解決錯誤, titile: Quartz業務類無法注入Spring對象問題 Quartz業務類無法注入Spring對象問題 在剛開始遇到的時候還以為是Spring配置哪里錯誤了,結果搞了那么久,才知道Quartz與Spring注入對象是不關聯的。。 因為Quartz的業務Job對象是由Quartz來…

如何解決ajax跨域問題

原文:http://www.congmo.net/blog/2012/06/27/ajax-cross-domain/ 跨域問題 起 因是這樣的,為了復用,減少重復開發,單獨開發了一個用戶權限管理系統,共其他系統獲取認證與授權信息,暫且稱之為A系統&#xf…

spring bean創建細節

1) 對象創建: 單例/多例 scope"singleton", 默認值,即默認是單例【service/dao/工具類】 scope"prototype", 多例;【Action對象】 2) 什么時候創建? scope"prototype" 在用到對象的時候&#xff0c…

發送郵件程序報錯454 Authentication failed以及POP3和SMTP簡介

一、發現問題 在測試郵件發送程序的時候,發送給自己的QQ郵箱,程序報錯454 Authentication failed, please open smtp flag first。 二、解決問題 進入QQ郵箱——>設置——>賬戶——>POP3/IMAP/SMTP選擇——>開啟POP3/SMTP服務。 三、POP3和S…

MySQL數據庫是非關系_MySQL(數據庫)基礎知識、關系型數據庫yu非關系型數據庫、連接認證...

什么是數據庫?數據庫(Database):存儲數據的倉庫高效地存儲和處理數據的介質(介質主要是兩種:磁盤和內存)數據庫系統:DBS(Database System):是一種虛擬系統,將多種內容關聯起來的稱呼DBS DBMS DBDBMS&…