首页 > 代码库 > C++实现链式栈,运用模板,界面友好,操作方便,运行流畅

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

 

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