1. Stack
#include <iostream> using namespace std; template <typename T> struct _tagNode{ _tagNode* p_nextNode; T m_data; }; template <typename T> struct _tagStack{ _tagNode<T>* TOS; unsigned int iSize; _tagStack() :iSize(0), TOS(NULL) { } void push(_tagNode<T>* nodeToPush) { nodeToPush->p_nextNode = (iSize != 0) ? TOS : NULL; TOS = nodeToPush; ++iSize; } _tagNode<T>* pop() { if (iSize == 0) { cout << "underflow" << endl; system("pause"); exit(1); } _tagNode<T>* temp; temp = TOS; TOS = TOS->p_nextNode; --iSize; return temp; } }; int main() { _tagNode<int> iTagArr[10]; _tagStack<int> iStk; _tagNode<float> fTagArr[10]; _tagStack<float> fStk; for (int i = 0; i < 10; ++i) { iTagArr[i].m_data = i; fTagArr[i].m_data = (float)i * 0.1f; iStk.push(&iTagArr[i]); fStk.push(&fTagArr[i]); } for (int i = 0; i < 10; ++i) cout << iStk.pop()->m_data << endl; for (int i = 0; i < 10; ++i) cout << fStk.pop()->m_data << endl; system("pause"); return 0; }
2. Queue
#include <iostream> using namespace std; template <typename T> struct _tagNode { _tagNode* p_nextNode; T m_data; }; template <typename T> struct _tagQueue { _tagNode<T>* TOQ; _tagNode<T>* prevNode; unsigned int iSize; _tagQueue() :iSize(0), TOQ(NULL), prevNode(NULL) { } void Enqueue(_tagNode<T>* nodeToPush) { if (iSize == 0) { TOQ = nodeToPush; } else { prevNode->p_nextNode = nodeToPush; } prevNode = nodeToPush; ++iSize; } _tagNode<T>* Dequeue() { if (iSize == 0) { cout << "underflow" << endl; system("pause"); exit(1); } _tagNode<T>* temp; temp = TOQ; TOQ = TOQ->p_nextNode; --iSize; return temp; } }; int main() { _tagNode<int> iTagArr[10]; _tagQueue<int> iQueue; _tagNode<float> fTagArr[10]; _tagQueue<float> fQueue; for (int i = 0; i < 10; ++i) { iTagArr[i].m_data = i; fTagArr[i].m_data = (float)i * 0.1f; iQueue.Enqueue(&iTagArr[i]); fQueue.Enqueue(&fTagArr[i]); } for (int i = 0; i < 10; ++i) cout << iQueue.Dequeue()->m_data << endl; for (int i = 0; i < 10; ++i) cout << fQueue.Dequeue()->m_data << endl; system("pause"); return 0; }