Java數(shù)據(jù)結(jié)構(gòu)之棧的詳解
棧是先進(jìn)后出的特殊線性表,只允許在表的末端進(jìn)行插入和刪除,后面將介紹兩種實(shí)現(xiàn)棧的方式,分別是基于數(shù)組的實(shí)現(xiàn)、基于鏈表的實(shí)現(xiàn)。
棧的抽象定義
class Mystack
{
public:
Mystack() {}
virtual void push(int &x) = 0;
virtual bool pop(int &x) = 0;
virtual bool Top(int &x) const = 0;
virtual bool IsEmpty()const = 0;
virtual bool IsFull()const = 0;
virtual int getSize()const = 0;
};
順序棧-----------使用數(shù)組表示棧空間
定義:
#pragma once
#include "Mystack.h"
#include <iostream>
#include <assert.h>
using namespace std;
const int stackIncreament = 20;
class SeqStack : public Mystack
{
public:
SeqStack(int sz = 50); //建立一個(gè)空棧
~SeqStack() { delete[]elements; } //析構(gòu)函數(shù)
//如果棧滿,則溢出程序處理,否則插入x
void push(int &x);
//如果???,則返回FALSE,否則使用x傳遞棧頂?shù)闹担瑃op-1
bool pop(int &x);
//如果???,則返回FALSE,否則使用x傳遞棧頂?shù)闹?
bool Top(int &x);
//判斷棧是否為空
bool IsEmpty()const {
return (top == -1) ? true : false;
}
//判斷棧是都為滿
bool IsFull()const {
return (top == maxSize - 1) ? true : false;
}
//獲取棧當(dāng)前的size
int getSize()const {
return top + 1;
}
//將棧置空
void MakeEmpty() {
top = -1;
}
//重載 操作 <<
friend ostream& operator<<(ostream& os, SeqStack& s);
private:
int *elements; //棧數(shù)組指針
int top; //棧頂指針
int maxSize; //棧的最大容量
void overflowProcess(); //溢出處理程序
};
實(shí)現(xiàn):
#include "SeqStack.h"
SeqStack::SeqStack(int sz):top(-1),maxSize(sz)
{
elements = new int[maxSize]; //創(chuàng)建棧的數(shù)組空間
assert(elements == NULL); //斷言:動(dòng)態(tài)分配是否成功
}
void SeqStack::push(int & x)
{
//首先判斷棧是否已滿,滿則轉(zhuǎn)入溢出處理
if(IsFull() == true){
overflowProcess();
}
elements[++top] = x; //將top+1,再插入值x
}
bool SeqStack::pop(int & x)
{
//先判斷是否為空,為空則返回FALSE
if (IsEmpty() == true) {
return false;
}
x = elements[top--]; //使用x返回top所指,再講top-1
return true;
}
bool SeqStack::Top(int & x)
{
//空棧則為FALSE
if (IsEmpty() == true) {
return false;
}
//棧不為空,則返回棧頂元素的值
x = elements[top];
return true;
}
ostream& operator<<(ostream& os, SeqStack& s) {
//輸出棧中元素
os << "top = " << s.top << endl;
for (int i = 0; i <= s.top; ++i) {
os << i << ": " << s.elements[i] << endl;
}
return os;
}
void SeqStack::overflowProcess()
{
//棧溢出時(shí),擴(kuò)充棧的存儲(chǔ)空間
int *Newelement = new int[maxSize + stackIncreament];
if (Newelement == NULL) {
cout << "分配內(nèi)存失敗";
exit(1);
}
for (int i = 0; i <= top; ++i) {
Newelement[i] = elements[i];
}
delete[] elements;
elements = Newelement;
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Java棧和基礎(chǔ)隊(duì)列的實(shí)現(xiàn)詳解
- Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解
- Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解
- 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之棧
- java數(shù)據(jù)結(jié)構(gòu)關(guān)于棧的實(shí)例應(yīng)用
- Java數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列實(shí)例詳解
- 簡(jiǎn)單談?wù)凧ava中的棧和堆
- Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之棧
相關(guān)文章
SpringBoot集成Kafka 配置工具類(lèi)的詳細(xì)代碼
spring-kafka 是基于 java版的 kafka client與spring的集成,提供了 KafkaTemplate,封裝了各種方法,方便操作,它封裝了apache的kafka-client,不需要再導(dǎo)入client依賴,這篇文章主要介紹了SpringBoot集成Kafka 配置工具類(lèi),需要的朋友可以參考下2022-09-09
SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼
這篇文章主要介紹了SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼,主要包括hibernate攔截器的相關(guān)知識(shí),結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
Java String方法獲取字符出現(xiàn)次數(shù)及字符最大相同部分示例
這篇文章主要介紹了Java String方法獲取字符出現(xiàn)次數(shù)及字符最大相同部分,涉及java字符串的遍歷、比較、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式原理與用法詳解
這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式,簡(jiǎn)單說(shuō)明了責(zé)任鏈模式的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)責(zé)任鏈模式的具體用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08
java實(shí)現(xiàn)多人多牌數(shù)比較游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)多人多牌數(shù)比較游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Spring Boot 整合單機(jī)websocket的步驟 附github源碼
websocket 是一個(gè)通信協(xié)議,通過(guò)單個(gè) TCP 連接提供全雙工通信,這篇文章主要介紹了Spring Boot 整合單機(jī)websocket的步驟(附github源碼),需要的朋友可以參考下2021-10-10
java 關(guān)鍵字static詳細(xì)介紹及如何使用
這篇文章主要介紹了java 關(guān)鍵字static詳細(xì)介紹及如何使用的相關(guān)資料,需要的朋友可以參考下2017-03-03
SpringBoot使用 druid 連接池來(lái)優(yōu)化分頁(yè)語(yǔ)句
這篇文章主要介紹了SpringBoot使用 druid 連接池來(lái)優(yōu)化分頁(yè)語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor示例
這篇文章主要介紹了mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

