//.h文件 

#ifndef STACK_H
#define STACK_H #include<iostream>
#include<iomanip>
using namespace std; template<typename T> //链式栈结点
struct L_Node
{
T data;
L_Node<T>* next;
L_Node();
L_Node(const T&item,L_Node<T>* next=NULL); //重载构造函数
}; template<typename T> //链式栈类
class L_Stack
{
private:
L_Node<T>* top;
int size;
public:
L_Stack();
~L_Stack();
void Operation();
private:
bool Clear();
bool Creat();
bool Pop(T& item);
void ShowAll();
}; template<typename T> //结点构造函数
L_Node<T>::L_Node()
{
next = NULL;
} template<typename T> //结点构造函数重载
L_Node<T>::L_Node(const T& item, L_Node<T>* nextnode = NULL)
{
data = item;
next = nextnode;
}
template<typename T> //类的构造函数
L_Stack<T>::L_Stack()
{
top = NULL;
size = ;
} template<typename T> //析构函数
L_Stack<T>::~L_Stack()
{
if (top) Clear();
} template<typename T> //创建堆栈
bool L_Stack<T>::Creat()
{
top = new L_Node<T>;
if (top == NULL){ cout << "创建失败!" << endl; return false; }
size = ;
return true;
} template<typename T> //销毁堆栈
bool L_Stack<T>::Clear()
{
if (top == NULL){ cout << "栈未建立或已被销毁,无需再清!" << endl; return false; }
L_Node<T>* temp;
while (top != NULL)
{
temp = top->next;
delete top;
top = temp;
}
size = ;
return true;
} template<typename T> //弹出栈顶数据
bool L_Stack<T>::Pop(T& item)
{
if (!top){ cout << "栈还未创建或已被销毁,无法进行弹栈操作,请您先创建堆栈并压入数据!" << endl; return false; }
if (!size){ cout << "栈内数据已全部弹出,无法进行弹栈操作,请您先压入数据!" << endl; return false; }
//if (top==NULL||size==0){ cout << "栈还未创建或已被销毁,或数据已全部弹出,无法进行弹栈操作,请您先创建堆栈!" << endl; return false; }
item = top->data;
L_Node<T>* p = top;
top = top->next;
p->next = NULL;
delete p; //是否有必要?
size--;
return true;
} template<typename T> //显示所有数据
void L_Stack<T>::ShowAll()
{
L_Node<T>* p=top;
int count ;
cout << "栈顶→";
for (count = ; count <= size; count++, p = p->next)
{
if (count == size)cout << p->data;
else cout <<setw()<< p->data << "←→";
if (count % == &&count!=){cout << endl; cout << " "; }
}
cout << "←栈底" << endl;
}
template<typename T> //封装操作
void L_Stack<T>::Operation()
{
bool flager = true;
while (flager)
{
cout << "请您选择操作(输入操作前的数字进行选择):" << endl;
cout << "1.创建堆栈" << endl;
cout << "2.批量压入数据" << endl;
cout << "3.随机压入数据" << endl;
cout << "4.销毁堆栈" << endl;
cout << "5.弹出栈顶数据" << endl;
cout << "6.显示所有数据" << endl;
cout << "7.显示当前栈内数据个数" << endl;
int choice;
cin >> choice;
switch (choice)
{
//由用户创建堆栈
case :
{
if (top){ cout << "栈已创建,不能再创建!您可以销毁旧栈后再创建新栈。" << endl; break; } //先检测栈是否已创建
bool flag1;
//创建堆栈
cout << "正在创建堆栈,请等待……" << endl;
flag1 = Creat();
if (flag1){ cout << "堆栈创建成功!" << endl; }
break;
}
//批量压入数据
case :
{
int arrsize; bool flag2 = true;
if (!top){ cout << "栈还未创建或已被销毁,无法进行压栈操作,请您先创建堆栈!" << endl; break; }//判断是否有栈
//用户指定压入数据的个数,确保输入的是正整数
while (flag2)
{
cout << "请您输入欲压入数据的个数(注意:只能输入正整数,若您输入其它非法字符,后果自负!):" << endl;
cin >> arrsize;
if (arrsize <= )
{
cout << "请输入正整数!重新输入请按1,退出请按0:" << endl;
int flagnow;
cin >> flagnow;
if (flagnow == )goto mark2;
else flag2 = false;
}
if (flag2)flag2 = false;
else flag2 = true;
}
//压入
T* arr = new T[arrsize];
cout << "请您输入要压入的数据:" << endl;
cout << "注意:您输入的数据类型及个数应与您之前指定的一致,否则,造成的一切后果,将由您个人承担,程序开发者概不负责!" << endl;
for (int i = ; i < arrsize; i++) cin >> arr[i];
cout << "正在压入数据,请稍后……" << endl;
int i;
for (i = ; i < arrsize; i++)
{
top = new L_Node<T>(arr[i], top);
size++;
if (!top)
{
cout << "压入数据失败!" << endl;
cout << "此次新压入数据" << i << "个。" << endl;
cout << "目前栈内总数据" << size- << "个。" << endl;
goto mark2;
}
}
cout << "数据已成功压入!" << endl;
cout << "此次新压入数据" << i << "个。" << endl;
cout << "目前栈内总数据" << size << "个。" << endl;
mark2:break;
}
//随机压入数据
case :
{
if (!top){ cout << "栈还未创建或已被销毁,无法进行压栈操作,请您先创建堆栈!" << endl; break; }//判断是否有栈
cout << "注意:您输入的数据类型应与您之前指定的一致,否则,造成的一切后果,将由您个人承担,程序开发者概不负责!" << endl;
bool flag3 = true; int choice3;
while (flag3)
{
T itemer;
cout << "请输入您的数据(注意:只能输入一个数据,如果您输入多个,后果自负!)" << endl;
cin >> itemer;
top = new L_Node<T>(itemer, top);
if (!top){ cout << "压入数据失败!" << endl; goto mark3; }
if (top)
{
size++;
cout << "压入数据成功!" << endl;
cout << "目前栈内总数据" << size << "个。" << endl;
cout << "是否继续压入?继续请按1,否则请按0:" << endl;
cin >> choice3;
}
if (choice3 == )flag3 = false;
}
mark3:break;
}
//清空堆栈
case :
{
bool flag4 = false;
cout << "您确定要销毁栈?确定请按1,取消请按0:" << endl;
int choice4;
cin >> choice4;
if (choice4 == )flag4 = Clear();
if (flag4) cout << "栈已销毁!" << endl;
break;
}
//弹出栈顶数据
case :
{
bool flager=true, flag5; T topdata; int choice5;
while (flager)
{
flag5 = Pop(topdata);
if (!flag5)goto mark5;
if (flag5)
{
cout << "栈顶数据已成功弹出!" << endl;
cout << "目前栈内总数据" << size << "个。" << endl;
cout << "是否输出弹出的数据?是请按1,否则请按0:" << endl;
cin >> choice5;
if (choice5 == )cout << "弹出的栈顶数据为:" << topdata << endl;
}
cout << "是否继续弹出?继续请按1,否则请按0:" << endl;
cin >> choice5;
if (choice5 == )flager = false;
}
mark5: break;
}
//显示所有数据
case :
{
if (!top){ cout << "栈还未创建或已被销毁,无法显示数据,请您先创建堆栈并压入数据!" << endl; break; }
if (!size){ cout << "栈内数据已全部弹出,无法显示数据,请您先压入数据!" << endl; break; }
//if (!top||size==0){ cout << "栈还未创建或已被销毁,或数据已全部弹出,无法显示数据,请您先创建堆栈或压入数据!" << endl; break; }
cout << "目前栈内共有元素" <<size<<"个:"<< endl;
ShowAll();
break; }
//显示当前栈内数据个数
case :
{
if (!top){ cout << "栈还未创建或已被销毁,无法显示数据个数,请您先创建堆栈并压入数据!" << endl; break; }
if (!size){ cout << "栈内数据已全部弹出,无法显示数据个数,请您先压入数据!" << endl; break; }
cout << "目前栈内共有元素" << size << "个。" << endl;
break;
}
//处理用户的错误输入
default:
{
cout << "您的输入有误,无法进行操作!" << endl;
break;
} }//switch结束
//控制循环
cout << "是否继续?继续请按1,退出请按0:" << endl;
int ifgoon;
cin >> ifgoon;
if (ifgoon == )flager = false;
}//while结束
}
#endif //.cpp文件 #include"stack.h"
#include<iostream>
//#include<iomanip>
using namespace std;
int main()
{
//是否进入程序
int flagall; bool flag = true;
cout << "敬告;请您务必按提示要求操作,如果您进行了规定以外的操作,由此造成的一切后果,将全部由您个人承担,程序开发者概不负责!" << endl;
cout << "是否进入程序?进入请按1,否则按0;" << endl;
cin >> flagall;
if (flagall == ) return ;
//用户选择类型
while (flag)
{
cout << "请选择您所要创建堆栈的数据类型,输入类型前的数字进行选择;" << endl;
cout << "1.整型 2.浮点 3.字符" << endl;
cin >> flagall;
if (flagall != && flagall != && flagall != )
{
cout << "您的输入有误!重新输入请按1,退出请按0:" << endl;
cin >> flagall;
if (flagall == )return ;
else flag = false;
}
if (flag) flag = false;
else flag = true;
}
switch (flagall)
{
case :
{
L_Stack<int> stack_int;
stack_int.Operation();
break;
}
case :
{
L_Stack<float> stack_float;
stack_float.Operation();
break;
}
case :
{
L_Stack<char> stack_float;
stack_float.Operation();
break;
}
default:
cout << "您的输入有误!" << endl;
break;
}
return ;
} 代码已经过测试,在VS2013上成功运行! 发此文有两大目的: .和大家交流经验,供需要的人参考。 .在下菜鸟,代码中难免有不妥之处,恳求大神批评指正。您的批评就是在下提高的起点,对于您的批评,在下将不胜感激!

C++实现链式栈,运用模板,界面友好,操作方便,运行流畅的更多相关文章

  1. C++实现二叉树,运用模板,界面友好,操作方便 运行流畅

    //.h文件 #ifndef TREE_H #define TREE_H #include<iostream> #include<iomanip> using namespac ...

  2. 同花顺核新下单程序的"界面不操作超时时间"的设定

    "界面不操作超时时间"的设定 同花顺核新下单程序的'界面不操作超时时间'的设定 系统> 系统设置> 界面设置> 界面不操作超时时间(分): 在这个输入框里填上个3 ...

  3. python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作

    一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...

  4. Rattle:数据挖掘的界面化操作

    R语言是一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具.这里的统计计算可以是数据分析.建模或是数据挖掘等,通过无数大牛提供的软件包,可以帮我们轻松实现算法的实施. 一些读者 ...

  5. linux复习3:linux字符界面的操作

    一.前言 1.对linux服务器进行管理的时候,经常要进入字符界面进行操作,使用命令需要记住该命令的相关选项和参数.vi编辑器可以用于编辑任何ASCII文本,功能非常的强大,可以对文本进行创建.查找. ...

  6. python框架Django中MTV框架之Template(模板/界面)

    MTV框架之Template(模板/界面) 关注公众号"轻松学编程"了解更多. 1.模板目录位置 应用下 不需要注册 无法跨应用地进行复用 工程下 需要注册 settings.py ...

  7. C++实现树的基本操作,界面友好,操作方便,运行流畅,运用模板

    Ⅰ.说明: .采用左孩子右兄弟的方式,转化为二叉树来实现. .树的后根遍历与二叉树的中根遍历即有联系又有区别,请读者注意分析体会. Ⅱ.功能: .创建树并写入数据 .先根遍历树 .计算树高 .后根遍历 ...

  8. C++,利用链式栈实现括号匹配,界面友好,操作方便,运行流畅

    #include<iostream> #include<string> using namespace std; struct Node { char ch; Node* ne ...

  9. C++实现有向权图的基本操作,界面友好,操作方便,运行流畅

    Ⅰ.功能: .创建图 .展示全图 .添加顶点 .添加边 .删除顶点 .删除边 .查看指定边权值 .修改指定边权值 .输出两点间的所有简单路及路径对应权值 .销毁图 ps:关于9,如果不存在任何简单路, ...

随机推荐

  1. zw版【转发·台湾nvp系列例程】HALCON ShapeTrans(Delphi)

    zw版[转发·台湾nvp系列例程]HALCON ShapeTrans(Delphi) procedure TForm1.Button1Click(Sender: TObject);var img: H ...

  2. 【py网页】urlopen的补充,完美

    urllib 是 python 自带的一个抓取网页信息一个接口,他最主要的方法是 urlopen(),是基于 python 的 open() 方法的.下面是主要说明: 1 urllib.urlopen ...

  3. 什么是BI【转】

    产品与服务 - 商务智能 目前,商业智能产品及解决方案大致可分为数据仓库产品.数据抽取产品.OLAP产品.展示产品.和集成以上几种产品的针对某个应用的整体解决方案     商业智能是什么? 简而言之, ...

  4. 关于ScrollView中嵌套listview焦点滑动问题 解决

    (第三种,第四种简单推荐使用) 在这里我要提出的是,listview能滚动的前提是:当listview本身的高度小于listview里的子view. 第一种方法 只需在MainActivity中 找到 ...

  5. MySQL5.5半同步模式

    MySQL5.5支持半同步的复制模式,什么是半同步的? 1. MySQL5.5之前的Master-SLave的复制模式是异步的,这里的文档有详细的说明;

  6. android 常用命令

    1.查看当前手机界面的 Activity   dumpsys | grep "mFocusedActivity" 查看任务栈 dumpsys | grep "Hist&q ...

  7. 深入理解HTTP协议、HTTP协议原理分析【转】

    转自:http://blog.csdn.net/lmh12506/article/details/7794512 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 基础概念篇 ...

  8. vmdk虚拟机转换为OVF模板,导入esxi

    VMware WorkStation安装目录下,有一个OVFTool文件夹,例如我电脑上的路径为:D:\VMware\VMware\OVFTool.通过CMD进入到命令行模式,更改到该目录下,运行如下 ...

  9. HDU 5794:A Simple Chess(Lucas + DP)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走.里 ...

  10. 《图解TCP/IP》

    MAC寻址:地址转发表:IP寻址:路由控制表. 网卡(网络接口卡),NIC. 循环复用DNS技术. 代理服务器是一种应用网关.防火墙. LLC是Logical Link Control的缩写,意为:逻 ...