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

6 篇文章 0 订阅
3 篇文章 0 订阅

//.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 = 0;
}

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 = 0;
 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 = 0;
 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 = 1; count <= size; count++, p = p->next)
 {
  if (count == size)cout << p->data;
  else cout <<setw(10)<< p->data << "←→";
  if (count % 5 == 0&&count!=5){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 1:
  {
      if (top){ cout << "栈已创建,不能再创建!您可以销毁旧栈后再创建新栈。" << endl; break; }     //先检测栈是否已创建
      bool flag1;
      //创建堆栈
      cout << "正在创建堆栈,请等待……" << endl;
      flag1 = Creat();
      if (flag1){ cout << "堆栈创建成功!" << endl; }
     break;
  }
  //批量压入数据
  case 2:
  {
      int arrsize;   bool flag2 = true;
      if (!top){ 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++)
      {
       top = new L_Node<T>(arr[i], top);
        size++;
       if (!top)
       {
        cout << "压入数据失败!" << endl;
        cout << "此次新压入数据" << i << "个。" << endl;
        cout << "目前栈内总数据" << size-1 << "个。" << endl;
        goto mark2;
       }         
      }
      cout << "数据已成功压入!" << endl;
      cout << "此次新压入数据" << i << "个。" << endl;
      cout << "目前栈内总数据" << size << "个。" << endl;
     mark2:break;
  }
  //随机压入数据
  case 3:
  {
      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 == 0)flag3 = false;
      }
     mark3:break;
  }
  //清空堆栈
  case 4:
  {
      bool flag4 = false;
      cout << "您确定要销毁栈?确定请按1,取消请按0:" << endl;
      int choice4;
      cin >> choice4;
      if (choice4 == 1)flag4 = Clear();
      if (flag4) cout << "栈已销毁!" << endl;
      break;
  }
  //弹出栈顶数据
  case 5:
  {
      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 == 1)cout << "弹出的栈顶数据为:" << topdata << endl;
       }
       cout << "是否继续弹出?继续请按1,否则请按0:" << endl;
       cin >> choice5;
       if (choice5 == 0)flager = false;
      }
     mark5: break;
  }
  //显示所有数据
  case 6:
  {
      if (!top){ cout << "栈还未创建或已被销毁,无法显示数据,请您先创建堆栈并压入数据!" << endl; break; }
      if (!size){ cout << "栈内数据已全部弹出,无法显示数据,请您先压入数据!" << endl; break; }
      //if (!top||size==0){ cout << "栈还未创建或已被销毁,或数据已全部弹出,无法显示数据,请您先创建堆栈或压入数据!" << endl; break; }
      cout << "目前栈内共有元素" <<size<<"个:"<< endl;
      ShowAll();
      break;

  }
    //显示当前栈内数据个数
  case 7:
  {
      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 == 0)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 == 0) return 0;
 //用户选择类型
 while (flag)
 {
  cout << "请选择您所要创建堆栈的数据类型,输入类型前的数字进行选择;" << endl;
  cout << "1.整型  2.浮点  3.字符" << endl;
  cin >> flagall;
  if (flagall != 1 && flagall != 2 && flagall != 3)
  {
   cout << "您的输入有误!重新输入请按1,退出请按0:" << endl;
   cin >> flagall;
   if (flagall == 0)return 0;
   else  flag = false;
  }
  if (flag) flag = false;
  else flag = true;
 }
 switch (flagall)
 {
 case 1:
 {
     L_Stack<int> stack_int;
     stack_int.Operation();
     break;
 }
 case 2:
 {
     L_Stack<float> stack_float;
     stack_float.Operation();
     break;
 }
 case 3:
 {
     L_Stack<char> stack_float;
     stack_float.Operation();
     break;
 }
 default:
  cout << "您的输入有误!" << endl;
  break;
 }
 return 0;
}

代码已经过测试,在VS2013上成功运行!

发此文有两大目的:

1.和大家交流经验,供需要的人参考。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值