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.在下菜鸟,代码中难免有不妥之处,恳求大神批评指正。您的批评就是在下提高的起点,对于您的批评,在下将不胜感激!


0 0
原创粉丝点击