设为首页 加入收藏

TOP

栈的解析及C++实现(一)
2017-01-24 08:15:35 】 浏览:471
Tags:解析 实现

栈是一种线性结构,它有以下几个特点:


1)栈中数据是按照“后进先出”方式进出栈的


2)向栈中添加/删除数据时,只能从栈顶进行操作


栈通常包括三种操作:top、pop、push


top -- 返回栈顶元素


pop -- 返回并删除栈顶元素


push -- 向栈中添加元素


常见错误:栈空时进行top或pop操作


解决方法:用户在使用top或pop操作时,需确保栈是非空的



?


出栈




?


入栈



顺序栈结构实现的头文件SeqStack.h


#ifndef SeqStack_byNim
#define SeqStack_byNim


#include
using namespace std;


const int MAX_SIZE=100;


template
class SeqStack
{
?private:
? T *data;
? int topPointer;
?public:
? SeqStack();
? ~SeqStack();
?
? void push(T e);
? T pop();
? T top();
?
? bool empty();
};


template
SeqStack::SeqStack()
{
?topPointer=-1;
?data=new T[MAX_SIZE];
}


template
SeqStack::~SeqStack()
{
?topPointer=-1;
?delete []data;
}


template
void SeqStack::push(T e)?//入栈操作
{
?if(topPointer==MAX_SIZE-1)?
?{
? cout<<"OVERFLOW"<?}
?topPointer++;
?data[topPointer]=e;
}


template
T SeqStack::pop()?//出栈操作
{
?if(topPointer==-1)
?{
? throw "栈空";
?}
?return data[topPointer--];
}


template
T SeqStack::top()
{
?if(topPointer==-1)
?{
? throw "栈空";
?}
?return data[topPointer];
}


template
bool SeqStack::empty()
{
?if(topPointer==-1)
?{
? return true;
?}
?return false;
}


#endif


测试文件:SStackTest.cpp


#include
#include "SeqStack.h"
using namespace std;


int main()
{
?int tmp = 0;
?SeqStack *astack = new SeqStack;
?
?cout<<"main"<?
?//将10, 20, 30 依次推入栈中
?astack->push(10);
? ? astack->push(20);
? ? astack->push(30);
? ?
? ? // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
? ? tmp = astack->pop();
? ? cout<<"tmp="<? ?
? ? // 只将“栈顶”赋值给tmp,不删除该元素
? ? tmp = astack->top();
? ? cout<<"tmp="<? ?
? ? astack->push(40);
? ?
? ? while(!astack->empty())
? ? {
? ? ?tmp = astack->pop();
? ? ?cout<<"tmp="<?}
?return 0;
}


链栈结构实现的头文件:LinkStack.h


#ifndef LinkStack_byNim
#define LinkStack_byNim


#include
using namespace std;


template
struct Node
{
?T data;?//数据域
?Node *next;?//指针域
};


template
class LinkStack
{
?private:
? Node *topPointer;
?public:
? LinkStack();
? ~LinkStack();
?
? void push(T e);
? T pop();
? T top();
?
? bool empty();
};


template
LinkStack::LinkStack()
{
?topPointer=new Node;
?topPointer->next=NULL;
}?


template?
LinkStack::~LinkStack()
{
?delete topPointer;
}


template
void LinkStack::push(T e)
{
?Node *aNode;
?aNode=new Node;
?aNode->data=e;
?aNode->next=topPointer;
?topPointer=aNode;
}


template
T LinkStack::pop()
{
?if(topPointer==NULL)
? throw "下溢";
?Node *p;
?p=topPointer;
?T rtndata = topPointer->data;
?topPointer=topPointer->next;
?delete p;
?return rtndata;
}


template
T LinkStack::top()
{
?if(topPointer==NULL)
? throw "Empty";
?return topPointer->data;
}


template
bool LinkStack::empty()
{
?if(topPointer==NULL)
? return true;
?return false;
}


#endif


测试文件:LStackTest.cpp


#include
#include "LinkStack.h"
using namespace std;


int main()
{
?string tmp;
?LinkStack *astack = new LinkStack;
?
?cout<<"main"<?
? //将"cat"、"dog"、"pig"依次推入栈中
?astack->push("cat");
? ? astack->push("dog");
? ? astack->push("pig");
? ?
? ? // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
? ? tmp = astack->pop();
? ? cout<<"tmp="<? ?
? ? // 只将“栈顶”赋值给tmp,不删除该元素
? ? tmp = astack->top();
? ? cout<<"tmp="<? ?
? ? astack->push("duck");
? ?
? ? while(!astack->empty())
? ? {
? ? ?tmp = astack->pop();
? ? ?cout<<"tmp="<?}
?return 0;
}


头文件:#include


测试文件:StackTest.cpp


#include
#include
using namespace std;


int main()
{
?int tmp = 0;
?stack *astack = new stack;
?
?cout<<"main"<?
?//将10, 20, 30 依次推入栈中
?astack->push(10);
? ? astack->push(20);
? ? astack->push(30);
? ?
? ? // 删除“栈顶元素”,pop操作不返回栈顶数据
? ? astack->pop();
? ? cout<<"tmp="<? ?
? ? // 只将“栈顶”赋值给tmp,不删除该元素
? ? tmp = astack->top();
? ? cout<<"tmp="<? ?
? ? astack->push(40);
? ?
? ? while(!astack->empty())
? ? {
? ? ?tmp = astack->top();
? ? ?cout<<"tmp="<? ? ?astack->pop();
?}
?return 0;
}


注意:STL中自带的stack的pop操作不返回栈顶

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇二叉查找树详解及C++实现 下一篇二叉查找树解析及其C++实现

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目