链表栈的简单实现

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

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;
}

结果就不贴了。

时间: 2024-08-07 20:09:22

链表栈的简单实现的相关文章

链表栈

链表栈的代码已经写了好久了,今天给大家分享出来. 链表栈还是链表的那几样操作,很简单,把链表搞定,它就不在话下了.不对它做过多介绍了,直接贴代码,水平有限,有错误还请指出. lstack.h #ifndef _STACK_H #define _STACK_H #define MAXSIZE 10 typedef struct node { int data; struct node * next; } Node; typedef struct stack { Node * top; int si

顺序栈与链表栈的实现

栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种"先进后出"的操作模式.向栈内进数据称为压栈(Push),从栈里取出数据叫出栈(POp).例如压栈顺序为1.2.3.4.5,着出栈的顺序为5.4.3.2.1(只考虑一次性出栈的情况). 栈按照存储的方式,又分为顺序栈和链表栈.顺序栈基于数组实现,所以顺序栈存储数据的内存是连续的,在创建栈时规定好栈的大小,这样对内存的使用效率并不高.而链式栈则是采用了链表来实现,其元素的存储地址是不连续的,而且是

关于链表的一些简单操作

终于上黄金了.. 然后就是一波2连败... 最近 完全不想做题啊  一做题 就想碎觉啊 郁闷死了 根据书本 写了点关于单向链表的简单操作 可能还存在点小bug---先放它一马吧 以后可能再进行补充关于它的操作 毕竟还有好多 先慢慢找回敲键盘打代码的感觉 厌 1 /* 2 线性表之单向链表的一些常见操作 3 */ 4 #include <iostream> 5 using namespace std; 6 7 typedef int ElemType; 8 typedef struct LNod

C#栈的简单介绍

概 栈(Stack)代表了一个只有一个出口的后进先出的对象集合.在列表中添加一项,称为推入元素,从列表中移除一项时,称为弹出元素. Stack<T> 类 public class Stack<T> : IEnumerable<T>, ICollection, IEnumerable 属性 Count 获取 Stack 中包含的元素个数 方法 Pop  移除并返回在 Stack 的顶部的对象 push 向 Stack 的顶部添加一个对象 peek 返回在 Stack 的顶

顺序栈的简单操作

今天简单的实现了一下顺序栈,栈的核心函数是push(),top(),pop().首先是我自己编写的栈,后面是STL标准库调用栈函数. sqstack.h //栈的简单实现lifo #ifndef SQSTACK_H_ #define SQSTACK_H_ const int DEFAULT_SIZE=10; #include <iostream> using std::cout; using std::endl; template <typename T> class Sqstac

C++中 栈的简单封装

/*******************  *      Stack    *  * *****************/ #include <iostream> using namespace std; /***************************定义***************************************/ class Stack {     public: Stack(int capacity = 5); virtual ~Stack(); bool p

栈及其简单应用

栈是什么 栈就是一个先进先出的线性表,若能够更加方便地去理解栈,我们可以跟剧具体的图来进行理解. 相信这个图十分的生动形象,可以看出栈就像是一个桶,若每一个元素进栈的时候,便会存储在最底下,后来的会在上面:而如果需要取出元素,那么必须从最上面开始取,先放的便只能后来取,后放的便只能先取,因此栈的特点便是:先进后出,后进先出. 如何模拟并存储栈的操作 为了方便,我们需要用数组去模拟栈的序列.即: 我们定义数组和变量来表示栈,即: Stack表示栈的序列,top代表栈的元素个数,那么自然: Stac

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip

栈的简单实现(2)-单链表实现

引言 栈(stack)是一种被广泛使用的线性数据结构,它只允许在表的一端进行插入或删除操作,因而栈也可以被称作为操作受限的线性表 .在栈中,允许插入或删除的一端称作栈顶(top)不允许插入和删除的另一端称作栈底(bottom); 示意图如下: 此文借助单链表简单地实现栈及其基本操作. 代码如下: typedef struct stack{ int data; struct stack* next; }ListStack; 注:这里假设栈中储存的是整型 (int) 的数据 基本操作 1.栈的初始化