码迷,mamicode.com
首页 > 其他好文 > 详细

链表栈的简单实现

时间:2015-05-26 12:48:42      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

今天实现了链表栈的简单实现,贴出来以后可以看一看。链表栈就是用链表来实现栈的一些操作。

LinkStack.h

#ifndef LINKSTACK_H_
#define LINKSTACK_H_
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
template <typename T>
struct Node
{
	T data;
	Node<T> *next;
	Node();
	Node(T item, Node<T> *link=NULL);
};
template <typename T>
Node<T>::Node()
{
	next=NULL;
}
template <typename T>
Node<T>::Node(T item, Node<T> *link)
{
	data=item;
	next=link;
}
template<typename T>
class LinkStack
{
protected:
	Node<T> *top;
	void Init();
	Node<T> *GetElemPtr(int position) const;
public:
	LinkStack();
	virtual ~LinkStack();
    bool IsEmpty();
	int Length() const;
	void Clear();
	void Push(T e);
	T Top();
	T Pop();
	LinkStack(const LinkStack<T> &copy);
	LinkStack<T> &operator=(const LinkStack<T> &copy);
};
template <typename T>
void LinkStack<T>::Init()
{
	top=new Node<T>;
}
template <typename T>
Node<T> *LinkStack<T>::GetElemPtr(int position) const
{
	int Len=Length();
	Node<T> *tempPtr=top;
	int curPosition=0;
	while(tempPtr->next!=NULL && curPosition != position)
	{
		tempPtr=tempPtr->next;
		++curPosition;
	}
	if(/*tempPtr->next!=NULL && */curPosition == position)
	{
		return tempPtr;
	}
	else 
		return NULL;
}
template <typename T>
LinkStack<T>::LinkStack()
{
	Init();
}
template<typename T>
LinkStack<T>:: ~LinkStack()
{
	Clear();
	delete top;
}
template <typename T>
bool LinkStack<T>::IsEmpty()
{
	return top->next==NULL;
}
template <typename T>
int LinkStack<T>::Length() const
{
	Node<T> *tempPtr=top;
	int count=0;
	while(tempPtr->next!=NULL)
	{
		++count;
		tempPtr=tempPtr->next;
	}
	return count;
}
template <typename T>
void LinkStack<T>::Clear()
{
	Node<T> *tempPtr=top;
	int Len=Length();
	while(tempPtr->next!=NULL)
	{
		Node<T> *newPtr=GetElemPtr(Len-1);
		delete newPtr->next;
		newPtr->next=NULL;
		

	}
}
template <typename T>
void LinkStack<T>::Push(T e)
{
	int Len=Length();
	Node<T> *tempPtr;
	tempPtr=GetElemPtr(Len);
	Node<T> *newPtr=new Node<T>;
	tempPtr->next=newPtr;
	newPtr->data=e;
}
template <typename T>
T LinkStack<T>::Top()
{
	int Len=Length();
	Node<T> *tempPtr=GetElemPtr(Len);
	return tempPtr->data;
}
template<typename T>
T LinkStack<T>::Pop()
{
	int Len=Length();
	Node<T> *tempPtr=GetElemPtr(Len-1);
	Node<T> *newPtr=tempPtr->next;
	tempPtr->next=NULL;
	return newPtr->data;
}
template <typename T>
LinkStack<T>::LinkStack(const LinkStack<T> &copy)
{
	Init();
	/*Node<T> *tempPtr=copy.top;*/
	Node<T> *newPtr=top;
	Node<T> *nowPtr;
	int Len=copy.Length();
	int count=0;
	while(Len--)
	{
		++count;
		nowPtr=copy.GetElemPtr(count);
		Node<T>* tempPtr=new Node<T>;
		newPtr->next=tempPtr;
		tempPtr->data=nowPtr->data;
		newPtr=tempPtr;
	}
}
template <typename T>
LinkStack<T> &LinkStack<T>::operator=(const LinkStack<T> &copy)
{
	if(copy!=this)
	{
		Init();
		/*Node<T> *tempPtr=copy.top;*/
		Node<T> *newPtr=top;
		Node<T> *nowPtr;
		int Len=copy.Length();
		int count=0;
		while(Len--)
		{
			++count;
			nowPtr=copy.GetElemPtr(count);
			Node<T>* tempPtr=new Node<T>;
			newPtr->next=tempPtr;
			tempPtr->data=nowPtr->data;
			newPtr=tempPtr;
		}
	}
	return *this;
}
template <typename T>
ostream &operator <<(ostream &os, LinkStack<T> &Ls)
{
	cout<<"Last in first out: ";
	while(!Ls.IsEmpty())
	{
		cout<<Ls.Pop()<<" ";
	}
	cout<<endl;
	return os;
}

#endif
LinkStack.cpp

// LinkStack.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "LinkStack.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	LinkStack<int> Stack;
	for(int i=0; i<100; i++)
	{
		Stack.Push(i);
	}
	cout<<"链表的头结点为:"<<Stack.Top()<<endl;
	LinkStack<int> copy=Stack;
	LinkStack<int> copy1(Stack);
	cout<<"链表栈为:"<<Stack;
	cout<<"复制链表栈为:"<<copy;
	cout<<"复制链表栈为:"<<copy1;
	system("pause");
	return 0;
}
结果就不贴了。


链表栈的简单实现

标签:

原文地址:http://blog.csdn.net/jiang111_111shan/article/details/46004813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!