溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java數(shù)據(jù)結(jié)構(gòu)中棧的用法

發(fā)布時(shí)間:2021-09-26 13:47:56 來(lái)源:億速云 閱讀:150 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Java數(shù)據(jù)結(jié)構(gòu)中棧的用法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

棧是先進(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ù)組表示??臻g

定義:

#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ù)闹?,top-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;
}

上述就是小編為大家分享的Java數(shù)據(jù)結(jié)構(gòu)中棧的用法了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI