您的位置:首页 > 编程语言 > C语言/C++

C++实现顺序栈,运用模板,界面友好,操作方便,运行流畅

2014-11-01 21:03 591 查看

//.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.在下菜鸟,代码中难免有不妥之处,恳求大神批评指正。您的批评就是在下提高的起点,对于您的批评,在下将不胜感激!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: