zoukankan      html  css  js  c++  java
  • C++实现链式栈,运用模板,界面友好,操作方便,运行流畅

    //.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.在下菜鸟,代码中难免有不妥之处,恳求大神批评指正。您的批评就是在下提高的起点,对于您的批评,在下将不胜感激! 
  • 相关阅读:
    js操作cookies
    努力挣钱只是不希望我的爱情受到别人金钱的考验罢了
    ASP 删除字符串开始或/和末尾处指定字符(串)
    lhgdialog 窗体之间的传值
    vs2010教程开始
    打开某些网页时IE弹出安全警告
    flex 版本问题
    【jQuery插件】用于瀑布式布局(砖块)的插件jquery Masonry
    自动根据动态的intput计算值
    js日期格式“补零”
  • 原文地址:https://www.cnblogs.com/zpcdbky/p/4111283.html
Copyright © 2011-2022 走看看