数据结构学习二:栈

   限制插入和删除操作只能在一个位置上进行的表。对栈的基本操作有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;



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