1.栈的特点:先进后出,由栈顶指针来控制数据的存储。
2.队列的特点:先进先出。
3.链表主要的优点就是可以方便的进行插入、删除操作,利用这一优点,可以在游戏设计过程中方便地管理大量的数据。
4.单向线性表的链式存储:有一个数据,一个后指针。最后一个元素的Next指针为NULL.
5.栈是一种只允许在一端进行插入和删除的线性表,它是一种操作受限的线性表。
6.在表中只允许进行插入和删除的一端称为栈顶,另一端称为栈底。
7.栈的插入操作通常称为入栈或进栈,而栈的删除操作则称为出栈或退栈。当栈中没有数据元素时,称为空栈。
8.顺序栈类的代码:
#ifndef CStack_H_
#define CStack_H_
#pragma once
template<typename T> class CStack
{
protected:
const int m_iLength;
T * m_pArray; //存储数据的数组
int m_iStackTop; //栈顶元素标号,描述下一个可入栈位置
public:
CStack(int iLength);
~CStack(void);
//栈的基本操作:显示栈内元素、判定栈是否为满、
// 是否为空、入(压)栈、出栈
protected:
bool isFull();
bool isEmpty();
public:
void showStack();
void pushStack(T _data);
T popStack();
};
#endif
#include "Utility.h"
#include "Stack.h"
template<typename T>CStack<T>::CStack(int iLength):
m_iLength(iLength)
{
m_pArray = new T[m_iLength];
memset(m_pArray,0,m_iLength*sizeof(int));
m_iStackTop = 0;
}
template<typename T>CStack<T>::~CStack(void)
{
Safe_Delete_Array(m_pArray);
}
template<typename T>void CStack<T>::showStack()
{
if(isEmpty())
{
cout<<"空栈!!!"<<endl;
return;
}
cout<<"栈内元素为:"<<endl;
for( int i = m_iStackTop-1 ; i >= 0 ; --i )
cout<<"stack["<<i<<"]="<<m_pArray[i]<<endl;
}
template<typename T>bool CStack<T>::isFull()
{
if(m_iStackTop == m_iLength)
return true;
return false;
}
template<typename T>bool CStack<T>::isEmpty()
{
if(m_iStackTop == 0)
return true;
return false;
}
template<typename T>void CStack<T>::pushStack(T _data)
{
if(!isFull())
m_pArray[m_iStackTop++] = _data;
}
template<typename T>T CStack<T>::popStack()
{
T result = 0;
if(!isEmpty())
{
result = m_pArray[--m_iStackTop];
m_pArray[m_iStackTop] = 0;
}
return result;
}
9.链表操作:
#include "Utility.h"
//----节点的描述方式:通过结构体实现----
typedef struct stNode
{
int iValue; //节点数据域
stNode * pNext; //节点的指针域
}NODE, *LPNODE;
LPNODE pHead = NULL; //链表的头节点
LPNODE pTail = NULL; //链表的尾节点
//---显示链表中的所有元素---
void showList()
{
if(pHead == NULL)
cout<<"链表为空......"<<endl;
LPNODE pTemp = pHead;
while (pTemp) //通过链表头节点遍历链表所有元素
{
cout<<pTemp->iValue<<endl;
pTemp = pTemp->pNext; //指针下移
}
}
//----在链表头插入数据----
void insertNodeAtFront( int iData )
{
if(pHead == NULL) //链表中无节点
{
LPNODE pNode = new NODE;
pNode->iValue = iData;
pNode->pNext = NULL;
pHead = pNode;
pTail = pNode;
}
else //链表中已经存在节点
{
LPNODE pNode = new NODE;
pNode->iValue = iData;
pNode->pNext = pHead;
pHead = pNode;
}
}
//----在链表尾部插入数据----
void insertNodeAtBack( int iData )
{
if(pHead == NULL)
{
LPNODE pNode = new NODE;
pNode->iValue = iData;
pNode->pNext = NULL;
pHead = pNode;
pTail = pNode;
}
else
{
//1、创建该节点
LPNODE pNode = new NODE;
pNode->iValue = iData;
pNode->pNext = NULL;
//2、将该节点链接入链表
pTail->pNext = pNode;
pTail = pNode;
}
}
//----在链表中删除头节点元素----
int deleteNodeAtFront()
{
//链表中仅剩1个节点
if( pHead == pTail )
{
Safe_Delete(pHead);
pTail = NULL;
return 0;
}
LPNODE pTemp = pHead;
pHead = pHead->pNext;
int iResult = pTemp->iValue;
Safe_Delete(pTemp);
return iResult;
}
//----在链表中删除尾节点元素----
int deleteNodeAtBack()
{
//链表中仅剩1个节点
if( pHead == pTail )
{
Safe_Delete(pTail);
pHead = NULL;
return 0;
}
//让pDeleteNode指向尾节点
LPNODE pDeleteNode = pTail;
//通过遍历找到尾节点的前一个节点
LPNODE pTempNode = pHead;
while(pTempNode)
{
if(pTempNode->pNext == pTail)
{
pTail = pTempNode;
pTail->pNext = NULL;
break;
}
else
pTempNode = pTempNode->pNext;
}
//删除节点
int iResult = pDeleteNode->iValue;
Safe_Delete(pDeleteNode);
return iResult;
}
-----2015.6.4----在链表中删除指定元素----------
//int deleteNode( int iData )
//{
//LPNODE pTemp = pHead;
//int iResult = 0;
//while(pTemp)
//{
////单独判定头节点是否为我们要删除的节点
//if(pTemp->iValue == iData)
//{
//LPNODE pDeleteNode = pTemp;
//pTemp = pTemp->pNext;
//pHead = pHead->pNext;
//iResult = pDeleteNode->iValue;
//Safe_Delete(pDeleteNode);
//continue;
//}
//else//头节点不是我们要删除的节点
//{
//if(pTemp->pNext)
//{
//if( pTemp->pNext->iValue == iData )
//{
//LPNODE pDeleteNode = pTemp->pNext;
//pTemp->pNext = pDeleteNode->pNext;
//
//iResult = pDeleteNode->iValue;
//Safe_Delete(pDeleteNode);
//}
//}
//pTemp = pTemp->pNext;
//}
//}
//
//return iResult;
//}
void deleteNode(int iData)
{
if(!pHead)
return;
//定义一对儿 “伴生” 指针
LPNODE pPrevious = pHead;
LPNODE pLast = pHead->pNext;
while( pLast )
{
//1.头节点是否为要删除的节点
if(pPrevious->iValue == iData)
{
pHead = pHead->pNext;
LPNODE pDeleteNode = pPrevious;
pPrevious = pPrevious->pNext;
pLast = pLast->pNext;
Safe_Delete(pDeleteNode);
continue;
}
else
{
if(pLast->iValue == iData)
{
if( pLast == pTail )
{
pPrevious->pNext = NULL;
Safe_Delete(pLast);
pTail = pPrevious;
break;
}
pPrevious->pNext = pLast->pNext;
LPNODE pDeleteNode = pLast;
pLast = pLast->pNext;
Safe_Delete(pDeleteNode);
continue;
}
else
{
pPrevious = pPrevious->pNext;
pLast = pLast->pNext;
}
}
}
}
void main()
{
//showList();
//cout<<"--------在链表头部插入数据--------"<<endl;
//insertNodeAtFront(5);
//insertNodeAtFront(10);
//showList();
//cout<<"--------在链表尾部插入数据--------"<<endl;
//insertNodeAtBack(101);
//showList();
//cout<<"--------在链表头部删除数据--------"<<endl;
//cout<<"删除的元素值为:"<<deleteNodeAtFront()<<endl;
//showList();
//cout<<"--------在链表尾部删除数据--------"<<endl;
//cout<<"删除的元素值为:"<<deleteNodeAtBack()<<endl;
//showList();
//cout<<"--------在链表尾部删除数据--------"<<endl;
//cout<<"删除的元素值为:"<<deleteNodeAtFront()<<endl;
//showList();
//------------2015.6.4--------------
//insertNodeAtBack(10);
//insertNodeAtBack(20);
//insertNodeAtBack(30);
//insertNodeAtBack(10);
//insertNodeAtBack(40);
//showList();
//cout<<"----------删除元素值为30的节点----------"<<endl;
//deleteNode(30);
//showList();
cout<<"----------删除元素值为10的节点----------"<<endl;
deleteNode(40);
showList();
system("pause");
}
10.数据结构队列:
#include "Utility.h"
/*
队列的作用:
在Windows编程中,所有的"消息"都是靠"队列"来存储
并逐个处理
*/
//--------顺序队列--------
class COrderQueue
{
protected:
int m_iQueue[5];
int m_iHeadIndex;
int m_iTailIndex; //最后一个有效元素的下标
public:
COrderQueue()
{
memset(m_iQueue,0,5*sizeof(int));
m_iHeadIndex = m_iTailIndex = 0;
}
void showQueue();
void push_back(int _data);
int pop_front();
};
void COrderQueue::showQueue()
{
if( m_iQueue[m_iHeadIndex] == 0 )
{
cout<<"空队列"<<endl;
return ;
}
for(int i = m_iHeadIndex ; i <= m_iTailIndex ; ++i)
{
cout<<"队列["<<i<<"] = "<<m_iQueue[i]<<endl;
}
}
void COrderQueue::push_back(int _data)
{
//队列已满
if( m_iTailIndex == 5-1 )
{
cout<<"队列已满,无法插入数据"<<endl;
return;
}
//队列为空
if( m_iQueue[m_iHeadIndex] == 0 )
{
m_iQueue[m_iHeadIndex] = _data;
}
else
{
m_iQueue[++m_iTailIndex] = _data;
}
}
int COrderQueue::pop_front()
{
//队列为空
if( m_iQueue[m_iHeadIndex] == 0 )
{
cout<<"队列为空,无法出队列"<<endl;
return 0;
}
//队列不为空,记录出队列的数据
int iRemove = m_iQueue[m_iHeadIndex];
//元素移动
for(int i = m_iHeadIndex + 1 ; i <= m_iTailIndex ; ++i )
{
m_iQueue[i-1] = m_iQueue[i];
}
//原始队列最后一个有效数据赋值为0,并前移动m_iTailIndex
m_iQueue[m_iTailIndex--] = 0;
return iRemove;
}
//--------链式队列--------
typedef struct stNode
{
int iData;
stNode * pNext;
}NODE,*LPNODE;
class CListQueue
{
protected:
LPNODE m_pHead; //头
LPNODE m_pTail; //尾
public:
CListQueue(){m_pHead = m_pTail = NULL;}
void showQueue();
void push_back(int _data);
LPNODE pop_front();
};
void CListQueue::showQueue()
{
if(!m_pHead)
{
cout<<"队列为空,无法显示"<<endl;
return;
}
LPNODE pTemp = m_pHead;
while(pTemp)
{
cout<<pTemp->iData<<endl;
pTemp = pTemp->pNext;
}
}
void CListQueue::push_back(int _data)
{
LPNODE pNode = new NODE();
pNode->iData = _data;
pNode->pNext = NULL;
//空队列
if(!m_pHead)
{
m_pHead = pNode;
m_pTail = pNode;
}
else
{
m_pTail->pNext = pNode;
m_pTail = pNode;
}
}
LPNODE CListQueue::pop_front()
{
//队列为空
if(!m_pHead)
{
cout<<"队列为空,无法出队列"<<endl;
return NULL;
}
LPNODE pRemove = NULL;
如果队列仅有1个元素
//if( m_pHead == m_pTail )
//{
//pRemove = m_pHead;
//m_pHead = m_pHead->pNext;
//m_pTail = m_pTail->pNext;
//pRemove->pNext = NULL;
//}
//else//至少有2个元素
//{
pRemove = m_pHead;
m_pHead = m_pHead->pNext;
pRemove->pNext = NULL;
//}
//仅有1个元素
if( pRemove == m_pTail )
{
m_pTail = NULL;
}
return pRemove;
}
void main()
{
//--------顺序队列的调用--------
COrderQueue queue;
queue.push_back( 5);
queue.push_back(10);
queue.push_back(15);
queue.push_back(20);
queue.push_back(25);
queue.showQueue();
cout<<"出队列元素为:"<<queue.pop_front()<<endl;
queue.showQueue();
//--------链式队列的调用--------
cout<<"--------链式队列的调用--------"<<endl;
CListQueue listQueue;
listQueue.push_back( 5);
listQueue.push_back(10);
listQueue.push_back(15);
listQueue.showQueue();
cout<<"出队列的元素为:"<<listQueue.pop_front()->iData<<endl;
listQueue.showQueue();
cout<<"出队列的元素为:"<<listQueue.pop_front()->iData<<endl;
listQueue.showQueue();
cout<<"出队列的元素为:"<<listQueue.pop_front()->iData<<endl;
listQueue.showQueue();
system("pause");
}
11.链栈:
#include "Utility.h"
template <typename T> class NODE
{
public:
T iData;
NODE<T> * pNext;
};
template <typename T> class CStack
{
protected:
NODE<T> * pHead;
NODE<T> * pTail;
public:
CStack();
void showStack(); //显示栈元素
void push_Stack(T _data); //入栈
NODE<T> * pop_Stack(); //出栈
};
template<typename T>
CStack<T>::CStack()
{
pHead = NULL;
pTail = NULL;
}
template<typename T>
void CStack<T>::showStack()
{
if(pHead == NULL)
cout<<"栈为空"<<endl;
NODE<T> * pTemp = pHead;
while(pTemp)
{
cout<<pTemp->iData<<endl;
pTemp = pTemp->pNext;
}
}
template<typename T>
void CStack<T>::push_Stack(T _data)
{
NODE<T> * pNode = new NODE<T>();
pNode->iData = _data;
pNode->pNext = NULL;
if(pHead == NULL) //当链栈为空时
{
pHead = pNode;
pTail = pNode;
}
else //链栈不为空
{
pNode->pNext = pHead;
pHead = pNode;
}
}
template<typename T>
NODE<T> * CStack<T>::pop_Stack()
{
//如果栈内没有元素
if(pHead == NULL)
{
cout<<"栈内无元素,无法出栈"<<endl;
return NULL;
}
NODE<T> * pRemoveNode = NULL;
//如果栈内有且仅有1个元素
if(pHead->pNext == NULL)
{
pRemoveNode = pHead;
pHead = pTail = NULL;
return pRemoveNode;
}
//栈内具有多个元素
pRemoveNode = pHead;
pHead = pHead->pNext;
pRemoveNode->pNext = NULL;
return pRemoveNode;
}
/*
struct就是C语言时代的"类"
class 是C++语言时代的"类"
联系:都可以带构造函数,
区别是:struct默认访问权限是:public
class默认访问权限是:private
*/
struct stPlayer
{
string name;
int iLevel;
//结构体的构造函数
stPlayer(){ name = "" ; iLevel = 1;}
stPlayer(string _name,int _level)
{
name = _name;
iLevel = _level;
}
};
void main()
{
//--------int型链栈--------
cout<<"--------int型链栈--------"<<endl;
CStack<int> intStack;
intStack.push_Stack(5);
intStack.push_Stack(10);
intStack.push_Stack(15);
intStack.showStack();
NODE<int> * pRemoveNode = intStack.pop_Stack();
cout<<"出栈元素为:"<<pRemoveNode->iData<<endl;
intStack.showStack();
pRemoveNode = intStack.pop_Stack();
cout<<"出栈元素为:"<<pRemoveNode->iData<<endl;
intStack.showStack();
pRemoveNode = intStack.pop_Stack();
cout<<"出栈元素为:"<<pRemoveNode->iData<<endl;
intStack.showStack();
//--------float型链栈--------
cout<<"--------float型链栈--------"<<endl;
CStack<float> floatStack;
floatStack.push_Stack(1.5f);
floatStack.push_Stack(3.5f);
floatStack.push_Stack(5.5f);
floatStack.showStack();
NODE<float> * pRemove = floatStack.pop_Stack();
cout<<"出栈元素为:"<<pRemove->iData<<endl;
floatStack.showStack();
pRemove = floatStack.pop_Stack();
cout<<"出栈元素为:"<<pRemove->iData<<endl;
floatStack.showStack();
pRemove = floatStack.pop_Stack();
cout<<"出栈元素为:"<<pRemove->iData<<endl;
floatStack.showStack();
//--------结构体类型的链栈----------
CStack<stPlayer> playerStack;
playerStack.push_Stack(stPlayer());
playerStack.push_Stack(stPlayer("xiaohong",1));
system("pause");
}