數據結構學習二:棧

   限制插入和刪除操作只能在一個位置上進行的表。對棧的基本操作有Push(進棧)和Pop(出棧),前者相當於插入,後者則是刪除。棧也叫作先進後出表。

本文使用鏈表實現棧。

#pragma once

/*
* 鏈表類型聲明
*/
struct Node
{
	int Data;
	Node* Next;
};
#pragma once
#include "node.h"
/*
* 棧定義
* m_Head表示鏈表頭,用於標記棧是否爲空
* m_Top表示棧頂
*/
class MyStack
{
private:
	Node* m_Head;
	Node* m_Top;
public:
	MyStack();
	~MyStack();
public:
	void Push(int data);
	void Pop();
	int Top();
	bool IsEmpty();
	int Size();
	void ShowStack();
	void MakeEmpty();
private:
	void initialize();
};

#include "stdafx.h"
#include "MyStack.h"

/*
* 棧是限制插入和刪除只能在一個位置上進行的表
* 插入和刪除操作在棧頂進行。棧有叫後進先出表
*/
MyStack::MyStack()
{
	initialize();
}


MyStack::~MyStack()
{
}

/*
* data進棧,存放在棧頂
*/
void MyStack::Push(int data)
{
	Node* p = new Node();
	p->Data = data;
	p->Next = NULL;
	Node* q = m_Top;
	m_Top = p;
	m_Top->Next = q;
}
/*
* 棧頂元素出棧
*/
void MyStack::Pop()
{
	if (IsEmpty())
	{
		return;
	}
	Node* p = m_Top;
	m_Top = p->Next;
	delete p;
}
/*
*獲取棧頂元素
*/
int MyStack::Top()
{
	if (IsEmpty())
	{
		return 0;
	}
	return m_Top->Data;
}
/*
*判斷棧是否爲空棧
*/
bool MyStack::IsEmpty()
{
	if (m_Top == NULL || m_Top == m_Head)
	{
		return true;
	}
	return false;
}
/*
*棧包含元素個數
*/
int MyStack::Size()
{
	if (IsEmpty())
	{
		return 0;
	}
	int size = 0;
	Node* p = m_Top;
	while (p != NULL && p != m_Head)
	{
		size++;
		p = p->Next;
	}
	return size;
}
/*
*顯示棧情況
*/
void MyStack::ShowStack()
{
	if (IsEmpty())
	{
		cout << "this stack is empty!" << endl;
		return;
	}
	cout << "this stack is(top->bottom):" << endl;
	Node* p = m_Top;
	while (p!=NULL && p != m_Head)
	{
		cout << p->Data << "\t";
		p = p->Next;
	}
	cout << endl;
}

/*
*清空棧
*/
void MyStack::MakeEmpty()
{
	if(IsEmpty())
	{
		return;
	}
	while (m_Top != NULL && m_Top != m_Head)
	{
		Node* q = m_Top;
		m_Top = m_Top->Next;
		delete q;
	}
}

/*
*初始化
*/
void MyStack::initialize()
{
	m_Head = new Node();
	m_Head->Next = NULL;
	m_Top = m_Head;
}

測試類

int arrs[] = { 1, 2, 3, 4, 5 };
	MyStack* myStack = new MyStack();
	for each (int data in arrs)
	{
		myStack->Push(data);
	}
	myStack->ShowStack();
	for (int i = 0; i <= sizeof(arrs) / sizeof(int); i++) 
	{
		cout << myStack->Top() << endl;
		cout << myStack->Size() << endl;
		myStack->Pop();

		myStack->ShowStack();
	}

	for each (int data in arrs)
	{
		myStack->Push(data);
	}
	myStack->MakeEmpty();
	myStack->ShowStack();

	for each (int data in arrs)
	{
		myStack->Push(data);
	}
	myStack->ShowStack();

	WaitUserPressAKey();
    return 0;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章