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