链表栈的简单实现

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

补充下栈的使用,设计一个算法判别用字符串表示的表达式中符号(,),[,],{,}是否配对出现。

LinkStack.h

#ifndef LINKSTACK_H_
#define LINKSTACK_H_
#include 
using std::cout;
using std::endl;
using std::ostream;
template 
struct Node
{
	T data;
	Node *next;
	Node();
	Node(T item, Node *link=NULL);
};
template 
Node::Node()
{
	next=NULL;
}
template 
Node::Node(T item, Node *link)
{
	data=item;
	next=link;
}
template
class LinkStack
{
protected:
	Node *top;
	void Init();
	Node *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 ©);
	LinkStack &operator=(const LinkStack ©);
};
template 
void LinkStack::Init()
{
	top=new Node;
}
template 
Node *LinkStack::GetElemPtr(int position) const
{
	int Len=Length();
	Node *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 
LinkStack::LinkStack()
{
	Init();
}
template
LinkStack:: ~LinkStack()
{
	Clear();
	delete top;
}
template 
bool LinkStack::IsEmpty()
{
	return top->next==NULL;
}
template 
int LinkStack::Length() const
{
	Node *tempPtr=top;
	int count=0;
	while(tempPtr->next!=NULL)
	{
		++count;
		tempPtr=tempPtr->next;
	}
	return count;
}
template 
void LinkStack::Clear()
{
	Node *tempPtr=top;
	int Len=Length();
	while(tempPtr->next!=NULL)
	{
		Node *newPtr=GetElemPtr(Len-1);
		delete newPtr->next;
		newPtr->next=NULL;
		

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

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

#include "stdafx.h"
#include "LinkStack.h"
#include 

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	LinkStack Stack;
	for(int i=0; i<100; i++)
	{
		Stack.Push(i);
	}
	cout<<"链表的头结点为:"< copy=Stack;
	LinkStack copy1(Stack);
	cout<<"链表栈为:"<

结果就不贴了。

补充实验程序:头文件还是LinkStack.h 源文件为Main.cpp

#include "stdafx.h"
#include "LinkStack.h"
#include 
#include 

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	LinkStack Stack;
	string str;
	cout<<"请输入式子:";
	cin>>str;
	int Len=str.size();
	char c,e;
	for(int i=0; i
结果为:

链表栈的简单实现_第1张图片



你可能感兴趣的:(c和c++的学习)