棧
限制插入和刪除操作只能在一個位置上進行的表。對棧的基本操作有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;