1. 程式人生 > >棧的基本函式C++實現

棧的基本函式C++實現

       前兩天自己照著一些部落格仿寫了棧的C++,其間也出了一些問題,但是通過除錯,各個基本函式都得到了驗證。當然可能存在我不知道的問題,如果有小夥伴驗證我程式碼的時候出現了問題希望可以告知我一下,非常感謝。

程式碼如下:

Stack.h檔案

#pragma once
//棧的基本函式實現
#include<iostream>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int ElemType;
//定義棧節點
struct StackNode 
{
	ElemType value;
	StackNode *ptr;
};
//棧類及其相關函式
class Stack 
{
public:
	//建構函式
	Stack();
	//解構函式
	~Stack();
	//初始化棧
	bool InitStack();
	//銷燬棧
	bool DestroyStack();
	//清空棧
	void ClearStack();
	//判斷棧是否為空。是返回true,否則返回false
	bool StackEmpty();
	//返回棧長度
	int StackLength();
	//獲取棧頂元素
	ElemType GetTop();
	//壓棧
	void Push(ElemType e);
	//出棧
	ElemType Pop();
	//遍歷棧內元素並輸出顯示,但同時會清空棧
	void StackTraverse();
private:
	StackNode *top;
	StackNode *base;
	int stacksize;

};

Stack.cpp檔案

#include"Stack.h"
#include<stdio.h>
#include<stdlib.h>

//建構函式
Stack::Stack()
{
	top = NULL;
	base = NULL;
	stacksize = 0;
}
//解構函式
Stack::~Stack() 
{

}

//棧初始化
bool Stack::InitStack()
{
	base = new StackNode[STACK_INIT_SIZE];
	if (!base)
	{
		std::cout << "記憶體分配失敗" << std::endl;
		return false;
	}
	top = base;
	stacksize = STACK_INIT_SIZE;
	return true;
}

//銷燬棧
bool Stack::DestroyStack()
{
	if (base)
	{
		delete base;
		base = NULL;
		top = NULL;
		stacksize = 0;
		std::cout << "棧銷燬成功" << std::endl;
		return true;
	}
	else
	{
		std::cout << "棧記憶體分配失敗,不能銷燬棧" << std::endl;
		return false;
	}

}

//清空棧
void Stack::ClearStack()
{
	top = base;
}

//判斷棧是否為空
bool Stack::StackEmpty()
{
	if (base == top)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//返回棧元素長度
int Stack::StackLength()
{
	return (top - base);
}

//獲取棧頂元素
ElemType Stack::GetTop()
{
	ElemType e;
	if (top >base)
	{
		e =(top--)->value;
		return e;
	}
	else
	{
		return false;
	}
}

//壓棧
void Stack::Push(ElemType e)
{   //若棧滿,追加儲存空間
	if (top -base >= stacksize)
	{
		base = (StackNode*)realloc(base,stacksize + STACKINCREMENT*sizeof(StackNode));
		if (!base)
		{
			std::cout << "棧記憶體分配失敗" << std::endl;
			exit(-1);
		}
		top = base +stacksize;
		stacksize += STACKINCREMENT;
	}
	/*注意入棧時一定先賦值,然後棧頂再加1*/
	top->value = e;
	top++;
	stacksize++;
}

/*這種壓棧方式存在問題,後續思考一下*/
//void Stack::Push(ElemType data)
//{
//	StackNode *temp;	
//	temp = (StackNode *)new StackNode[1];
//	temp->value = data;	
//	temp->next = NULL;	
//	if (stacksize == 0)
//	{ top = (StackNode *)new StackNode[1];
//	  base = temp; 
//	}	
//	top->next = temp;	
//	top = temp;
//	stacksize++;
//	std::cout << "Push: 入棧成功!" << std::endl; 
//}

//出棧
ElemType Stack::Pop()
{
	ElemType e;
	if (top == base)
	{
		std::cout << "棧為空,無法出棧" << std::endl;
		exit(-1);
	}
	else
	{
		e = (--top)->value;
		top->value = 0;
		stacksize--;
		return e;
	}
	
}

//遍歷棧內容
void Stack::StackTraverse()
{
	
	ElemType e=0;
	if (top==base)
	{
		std::cout << "棧為空,無法出棧" << std::endl;
		exit(-1);
	}
	else
	{
		std::cout << "棧內元素為:";

		do
		{
			e=Pop();
			std::cout <<e<< " ";	
			//std::cout << (--top)->value << " ";
		} while (top!=base);
		std::cout << std::endl;
	}

}