C++实现顺序栈,运用模板,界面友好,操作方便,运行流畅
来源:互联网 发布:java权限管理实现 编辑:程序博客网 时间:2024/06/01 08:48
//.h文件
#ifndef STACK_H
#define STACK_H
#include<iostream>
template <typename T>
class Stack
{
private:
T* array;
int size;
int top;
private:
bool Push(const T& item);
bool Pop(T& item);
bool Creat(const int& num);
bool IfEmpty()const;
bool IfFull()const;
bool Clear();
void ShowAll();
void ShowNum();
public:
Stack();
~Stack();
void Operation();
};
//构造函数,初始化栈
template <typename T>
Stack<T>::Stack()
{
array = NULL;
size = 0;
top = -1;
}
//析构函数
template <typename T>
Stack<T>::~Stack()
{
if (array) delete[] array;
}
//判断栈是否为空
template <typename T>
bool Stack<T>::IfEmpty()const
{
if (!array)return true;
else return top==-1;
}
//判断栈是否已满
template <typename T>
bool Stack<T>::IfFull()const
{
return top == size - 1;
}
//创建一个用户指定大小的栈
template <typename T>
bool Stack<T>::Creat(const int& num)
{
array = new T[num];
if (!array){ cout << "申请空间失败!" << endl; return false; }
size = num;
top = -1;
return true;
}
//压栈
template <typename T>
bool Stack<T>::Push(const T& item)
{
if (!array){ cout << "堆栈未成功创建,无法压栈!" << endl; return false; }
if (IfFull())
{
cout << "栈已满,无法再压栈!" << endl;
//cout << "目前站内元素" << top+1 << "个。" << endl;
return false;
}
array[++top] = item;
return true;
}
//清空栈
template <typename T>
bool Stack<T>::Clear()
{
if (!array){ cout << "栈原本就为空,无需再清!" << endl; return false; }
else
{
delete[]array;
array = NULL;
top = -1;
size = 0;
return true;
}
}
//弹出栈顶元素
template <typename T>
bool Stack<T>::Pop(T& item)
{
if (IfEmpty()){ cout << "栈已空,无法弾栈!" << endl; return false; }
item = array[top--];
return true;
}
//显示所有数据
template <typename T>
void Stack<T>::ShowAll()
{
if (!IfEmpty())
{
cout << "目前栈的所有数据元素为:" << endl;
cout << "栈底→" ;
for (int i = 0; i <=top; i++)cout << array[i] << " ";
cout << "←栈顶" << endl;
}
else cout << "栈为空栈,没有数据元素!" << endl;
}
//显示当前站内元素个数
template <typename T>
void Stack<T>::ShowNum()
{
if (!array){ cout << "目前栈还未创建或已被销毁!" << endl; }
if (array&&top == -1){ cout << "目前站内数据个数为0,但栈已创建。" << endl; }
if (array&&top != -1){ cout << "目前栈内数据个数为" << top + 1 <<"。"<< endl; }
}
//封装操作
template <typename T>
void 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;
int choice;
cin >> choice;
switch (choice)
{
//由用户创建堆栈
case 1:
{
if (size){ cout << "栈已创建,不能再创建!您可以清空旧栈后再创建新栈。" << endl; break; } //先检测栈是否已创建
int number; bool itemflag = true;
while (itemflag) //用户指定堆栈大小,确保输入的是正整数
{
cout << "请您指定欲创建堆栈的大小:" << endl << "(注意:只能输入正整数,若您输入其它非法字符,后果自负!):" << endl;
cin >> number;
if (number <= 0)
{
cout << "请输入正整数!重新输入请按1,退出请按0:" << endl;
int flagnow;
cin >> flagnow;
if (flagnow == 0) goto mark;
else itemflag = false;
}
if (itemflag)itemflag = false;
else itemflag = true;
}
//创建堆栈
cout << "正在创建堆栈,请等待……" << endl;
itemflag = Creat(number);
if (itemflag){ cout << "堆栈创建成功!" << endl; }
mark: break;
}
//压入数据
case 2:
{
int arrsize; bool flag2 = true;
if (!array){ cout << "栈还未创建或已被清除,无法进行压栈操作,请您先创建堆栈!" << endl; break; }//判断是否有栈
if (IfFull()){ cout << "目前栈已满,无法进行压栈操作,请您先弹出栈内部分元素或者清空堆栈后创建新栈!" << endl; break; }//判断是否栈满
while (flag2)//用户指定压入数据的个数,确保输入的是正整数
{
cout << "请您输入欲压入数据的个数(注意:只能输入正整数,若您输入其它非法字符,后果自负!):" << endl;
cin >> arrsize;
if (arrsize <= 0)
{
cout << "请输入正整数!重新输入请按1,退出请按0:" << endl;
int flagnow;
cin >> flagnow;
if (flagnow == 0)goto mark2;
else flag2 = false;
}
if (flag2)flag2 = false;
else flag2 = true;
}
//压入
T* arr = new T[arrsize];
cout << "请您输入要压入的数据:" << endl;
cout << "注意:您输入的数据类型及个数应与您之前指定的一致,否则,造成的一切后果,将由您个人承担,程序开发者概不负责!" << endl;
for (int i = 0; i < arrsize; i++) cin >> arr[i];
cout << "正在压入数据,请稍后……" << endl;
int i;
for ( i = 0; i < arrsize; i++)
{
flag2 = Push(arr[i]);//如果循环结束之前栈已满,跳出循环
if (!flag2)
{
cout << "此次新压入数据" << i << "个。" << endl;
cout << "目前栈内总数据" << top + 1 << "个。" << endl;
break;
}
}
if (flag2)
{
cout << "数据已成功压入!" << endl;
cout << "此次新压入数据" << i << "个。" << endl;
cout << "目前栈内总数据" << top + 1 << "个。" << endl;
}
mark2:break;
}
//清空堆栈
case 3:
{
bool flag3 = false;
cout << "您确定要清空栈?确定请按1,取消请按0:" << endl;
int choice3;
cin >> choice3;
if (choice3 == 1)flag3 = Clear();
if (flag3) cout << "栈已清空!" << endl;
break;
}
//弹出栈顶数据
case 4:
{
bool flag4; T data;
flag4 = Pop(data);
if (flag4)
{
cout << "栈顶数据已成功弹出!是否输出该数据?是请按1,否请按0:" << endl;
int choice4;
cin >> choice4;
if (choice4 == 1)cout << "弹出的栈顶数据为:" << data << endl;
}
break;
}
//显示所有数据
case 5:
{
ShowAll();
break;
}
//显示当前栈内数据个数
case 6:
{
ShowNum();
break;
}
//处理用户的错误输入
default:
{
cout << "您的输入有误,无法进行操作!" << endl;
break;
}
}//switch结束
//控制循环
cout << "是否继续?继续请按1,退出请按0:" << endl;
int ifgoon;
cin >> ifgoon;
if (ifgoon == 0)flager = false;
}//while结束
}
#endif
//.cpp文件
#include"Stack.h"
#include<iostream>
using namespace std;
int main()
{
//是否进入程序
int flag1; bool flag = true;
cout << "敬告;请您务必按提示要求操作,如果您进行了规定以外的操作,由此造成的一切后果,将全部由您个人承担,程序开发者概不负责!" << endl;
cout << "是否进入程序?进入请按1,否则按0;" << endl;
cin >> flag1;
if (flag1 == 0) return 0;
//用户选择类型
while (flag)
{
cout << "请选择您所要创建堆栈的数据类型,输入类型前的数字进行选择;" << endl;
cout << "1.整型 2.浮点 3.字符" << endl;
cin >> flag1;
if (flag1!=1&&flag1!=2&&flag1!=3)
{
cout << "您的输入有误!重新输入请按1,退出请按0:" << endl;
cin >> flag1;
if (flag1 == 0)return 0;
else flag = false;
}
if (flag) flag = false;
else flag = true;
}
switch (flag1)
{
case 1:
{
Stack<int> stack_int;
stack_int.Operation();
break;
}
case 2:
{
Stack<float> stack_float;
stack_float.Operation();
break;
}
case 3:
{
Stack<char> stack_char;
stack_char.Operation();
break;
}
default:
cout << "您的输入有误!" << endl;
break;
}
return 0;
}
代码已经过测试,在VS2013上成功运行!
发此文有两大目的:
1.和大家交流经验,供需要的人参考。
2.在下菜鸟,代码中难免有不妥之处,恳求大神批评指正。您的批评就是在下提高的起点,对于您的批评,在下将不胜感激!
- C++实现顺序栈,运用模板,界面友好,操作方便,运行流畅
- C++实现链式栈,运用模板,界面友好,操作方便,运行流畅
- C++实现树的基本操作,界面友好,操作方便,运行流畅,运用模板
- C++实现二叉树,运用模板,界面友好,操作方便 运行流畅
- C++,利用链式栈实现括号匹配,界面友好,操作方便,运行流畅
- C++,利用链式栈实现括号匹配,界面友好,操作方便,运行流畅
- C++实现有向权图的基本操作,界面友好,操作方便,运行流畅
- C++实现有向权图的基本操作,界面友好,操作方便,运行流畅
- c++(模板类)实现顺序表
- 【C++】用模板实现顺序表
- 【C++】用模板实现顺序表Vector
- C++模板实现顺序栈
- Android 仿酷狗滑动控件实现 流畅运行
- C++ 实现顺序栈与链式栈操作…
- C语言实现顺序栈的基本操作
- C语言实现顺序栈的基本操作
- c实现顺序栈
- c实现顺序栈
- 两个jar包中,有相同资源,如何加载。
- Java 内存区域和GC机制
- Linux、Mac环境下MySQL的备份和还原
- MFC客户端WebService(gSOAP)天气预报
- 蓝牙
- C++实现顺序栈,运用模板,界面友好,操作方便,运行流畅
- 我是一个程序员
- 6、UDP套接字
- 人生规划
- JAVA GC机制
- Hexo 入门指南(四) - 页面、导航、边栏、底栏
- 一个关于UDP socket服务端接收长度不正确的问题
- Unix/Linux下MySQL的卸载
- SQL服务器的搭建