c++用双向链表实现模板栈
可直接编译运行,其中方法status为形象的显示出栈的结构:

// visual stack , need define "cout<<" #include <iostream>
using std::cout; template<typename T>
struct item
{
item():value(),last(NULL),next(NULL){}
item *last,*next;
T value;
};
template<typename T>
class Stack
{
public:
Stack():m_size(),m_bottom(NULL),m_top(NULL){}
int size();
bool push(const T&);
T pop();
T top();
bool empty();
void status();
private:
item<T> *m_bottom,*m_top;
int m_size;
}; ///////////////////
int main()
{
Stack<int> st;
for(int i=;i<;i++)
{
st.push(i);
st.status();
}
cout<<"size="<<st.size()<<"\n"; for( i=;i<;i++)
{
st.pop();
st.status();
}
if(st.empty())cout<<"empty\n";
cout<<st.top()<<"\n";
return ;
} ////////////////////////////
template<typename T>
inline int Stack<T>::size(){return m_size;} template<typename T>
inline bool Stack<T>::empty(){return m_size==?false:true;} template<typename T>
inline T Stack<T>::top(){return m_size!=?m_top->value:T();} template<typename T>
bool Stack<T>::push(const T& t)
{
if(m_size==)
{
m_bottom=new item<T>;
m_bottom->value=t;
m_top=m_bottom;
}
else
{
m_top->next=new item<T>;
m_top->next->value=t;
m_top->next->last=m_top;
m_top=m_top->next;
}
m_size++;
return true;
} template<typename T>
T Stack<T>::pop()
{
if(m_size==)
{
T t=m_top->value;
delete m_top;
m_bottom=m_top=NULL;
m_size=;
return t;
}
else if(m_size==)
{
return T();
}
else
{
T t=m_top->value;
m_top=m_top->last;
delete m_top->next;
m_top->next=NULL;
m_size--;
return t;
}
return T();
} template<typename T>
void Stack<T>::status()
{
item<T> *p;
cout<<"栈顶 |\n";
if( m_size== )return ;
else if(m_size<)
{
for(p=m_top;p!=NULL;p=p->last)
{
if(p->last==NULL)cout<<"栈底 |"<<p->value<<"|\n";
else cout<<" |"<<p->value<<"|\n";
}
}
else
{
int i;
for(p=m_top,i=;i<;p=p->last,i++)cout<<" |"<<p->value<<"|\n";
for(p=m_bottom,i=;i<;p=p->next,i++);
cout<<" 略...\n";
for(;i>=;i--,p=p->last)
{
if(i==)cout<<"栈底 |"<<p->value<<"|\n";
else cout<<" |"<<p->value<<"|\n";
}
}
}
c++用双向链表实现模板栈的更多相关文章
- ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(TSH OJ - Train)
本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) 描述 某列车调度站的铁道联接结构如Figure 1所示 ...
- hdu4699 Editor(双向链表或双栈对弹)
本题就是两个要点: 1.数据结构的设计.显然可以使用双向链表来做,但是写双向链表的代码复杂度高.其实更好的方法是使用两个对弹的栈来做,而且没必要用STL的栈,就自己开两个数组简单搞一下就好了. 2.最 ...
- SDUT OJ 2054 双向链表的实现 (结构体node指针+遍历 *【模板】)
双向链表 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内 ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)【转】
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 栈 - 从零开始实现by C++
参考链接:数据结构探险-栈篇 学了队列之后,栈就很简单了,换汤不换药. 栈 栈的模型 后进先出(电梯,进制转换,括号的匹配检测) 栈的基本元素 栈顶,栈底(一般很少用到),栈容量,栈长度 注意 ...
- C++学习笔记53:泛型程序设计与C++标准模板库
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...
- 你是否决绝平庸,你有勇气来学C/C++吗,有勇气来检验你是否经得起世界五百强的面试
如果你来传智播客学习 你的目标就是要积累工作经验 有机会参加世界五百强的面试 秒杀世界五百强的面试 赢得高薪的offer! C/C++课程大纲 C语言3周21天 完全掌握C语言的本质,成为一名合 ...
- 【Linux】-NO.87.Assembly.1.滴水逆向.1.001-【介绍】-
1.0.0 Summary Tittle:[Linux]-NO.87.Assembly.1.滴水逆向.1.001-[基础]- Style:Java Series:Log4j Since:2017-04 ...
随机推荐
- barabasilab-networkScience学习笔记2-图理论
第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...
- Linux学习笔记(15)shell基础之Bash基本功能
1 shell概述 shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序.用户可以用shell启动.挂起.停止甚至是编写一些程序. shell是一个功能强大 ...
- LoadRunner 脚本学习 -- 指针基础
先搞清楚 ++a 和 a++的区别 ++a : 前缀++, 先自增,后表达式 a++ : 后缀++, 先表达式,后自增 前缀,自增立即生效. 后缀,下次才会看到效果. 一维数组的指针 Action ...
- strcmp函数的使用
Action() { /********************************* * Author:旺仔 * object:strcmp * date:2015-12-09 ...
- 端口偷窃(Port Stealing)技术
端口偷窃(Port Stealing)技术 该技术主要用于局域网中间人攻击中,尤其目标计算机采用静态ARP后,导致ARP欺骗无效. 背景知识:路由器为了方便转发数据包,会在内部记录每个接口和M ...
- node body-parser
var express = require('express'); var app = express(); var bodyParser = require('body-parser'); // p ...
- 【CLR in c#】属性
1.无参属性 1.为什么有字段还需要属性呢? 因为字段很容易写出不恰当的代码,破坏对象的状态,比如Age=-1.人的年纪不可能为负数.使用属性后你可以缓存某些值或者推迟创建一些内部对象,你可以以线程安 ...
- 疯狂java学习笔记之面向对象(五) - 封装、继承、多态
一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...
- OpenCV播放视频带滚动条(3)
演示 :一个带有滚动条的播放视频的代码. #include "stdafx.h" #include <opencv2/core/core.hpp> #inclu ...
- Lc.exe已退出,代码为-1
编译项目,出现提示"Lc.exe已退出,代码为-1" . 解决办法: 意思就是把licenses.licx这个文件里的内容删除,但是文件还在(此时是个空文件),发生这个问题的原 ...