zgcyan 2021-04-25 14:46 采纳率: 0%
浏览 36

链式栈运行着突然自动停止运行

我真的要疯啦 我的这个程序 显示操作无法完成 求栈长操作也无法完成 在读取栈顶元素的时候 一旦有一个出栈操作 读取栈顶元素就会操作不了 但是不出栈又可以运行 还有好多问题啊!求大家的帮助  谢谢大家!!

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;

////////////////////////////////////////////////////////
//栈的定义:

template <class T>
class Stack{
    public:
        void clear();
        bool push (const T item);
        bool pop (T &item);
        bool high (T &item);
        void isEmpty();
        void isFull();
        void display();
        bool create(const T item);
        bool destory();
        int length( );
};

template <class T> 
class Link{
    public:
        T data;
        Link<T> * next;
};

////////////////////////////////////////////////////////
//构造函数:

template <class T>
class InkStack : public Stack <T>
{
    private:

        Link<T> *  top;     //指向栈顶的指针;
        int size;
        
    public:

        InkStack ( )
        {
            top=NULL;
            size=0;
        }


//////////////////////////////////////////////////////////
//析构函数:


        ~InkStack ()
        {
            clear();
        }


///////////////////////////////////////////////////////////////////
//清空栈的内容:


        void clear()
        {
            if(top==NULL) 
            {
                cout<<"该链式栈已经为空栈,清除失败!"<<endl;
            }
            else
            {
               Link <T> *tmp;
               while(top!=NULL)
               {
                  tmp=top;
                  top=top->next;
                  delete tmp;
               }
                  
                  cout<<"清除操作成功,链式栈已经为空!"<<endl;
            }
        }


////////////////////////////////////////////////////////////////////

//入栈操作的实现:


        bool push (const T item)
        {

                Link <T> *tmp=new Link <T>;
                top=tmp;
                top->data=item;
                size++;
                return true;
        }


/////////////////////////////////////////////////////////////////////

//出栈操作的实现:


        bool pop (T &item)
        {
        
            if(top==NULL)
            {
                cout<<"该链式栈为空栈,出栈失败!"<<endl;
                return false;
            }
            else
            {
                item = top -> data;
                Link<T> *tmp;
                tmp = top;
                top=top->next;
                delete tmp ;
                size--;
                return true;
            }
        }

///////////////////////////////////////////////////////////////////////

//读取栈顶元素的操作;


        bool high (T &item)
        {
            if(top==NULL)
            {
                cout<<"该链式栈为空栈,读取栈顶元素失败!"<<endl;
                return false;
            }
            else
            {
                item = top->data;
                return true;
            }
        }


///////////////////////////////////////////////////////////////////////

//判断栈是否为空的操作:


        void isEmpty()
        {
            if(top==NULL)
            {
                cout<<"该链式栈为空栈!"<<endl;
            }
            else
            {
                cout<<"该链式栈不为空栈!"<<endl;
            }
        }


///////////////////////////////////////////////////////////////////////

//判断链式栈是否为满的操作:


        void isFull()
        {
            if(top==NULL) 
            {
                cout<<"该链式栈为空!"<<endl;
            }
            else
            {
                cout<<"该链式栈还没有满!"<<endl;
            }
        }


/////////////////////////////////////////////////////////////////////////

//显示链式栈元素的操作;


        void display()
        {
            if(top==NULL)
            {
                cout<<"该链式栈为空栈,显示失败!"<<endl;
            }
            else
            {
                Link<T> *tmp;
                tmp=top;
                while(tmp->next!=NULL)
                {
                  cout<< tmp->data <<' ';
                  tmp=tmp->next;
                }
                cout<<endl;
            }
        }


///////////////////////////////////////////////////////////////////////////

//创建链式栈的操作;


        bool create(const T item)
        {
            if(!top)
            {
                size=item;
                top=NULL;
                return true;
            
            }
            else
            {
                cout<<"该链式表创建失败,已经存在链式表!"<<endl;
                return false;
            }
        }
    

/////////////////////////////////////////////////////////////////////////////
//销毁链式表的操作;


        bool destory()
        {
            if(!top)
            {
                cout<<"该链式栈已经被销毁不存在!"<<endl;
                return false;
            }
            else
            {
                Link<T> * tmp;                        //定义指向结点的指针        
              while(top!=NULL)
              {
                tmp=top;                        //tmp指向当前结点
                top=top->next;                //head指向下一结点
                delete tmp;    
              }  
               return true;
            }
        }


//////////////////////////////////////////////////////////////////////////////
//求长度的操作;


        int length( )
        {
            
                int i=0;
                Link <T> *tmp;
                while(top!=NULL)
                {
                  tmp=top->next;
                  i++;
                  top=tmp;
                }
                return i;
            
        }


///////////////////////////////////////////////////////////////////////////////


};
    

void main()
{
    InkStack <char>  IL;
    bool ok;
    int choice;
    char item;
    do {
        cout<<"请选择(0退出, 1清除, 2入栈, 3出栈, 4读取栈顶内容, 5判断表空, 6判断表满, 7显示, 8消除,9创建,10栈长):"<<endl;
        cin>>choice;
        switch (choice) {
        case 0:
            cout<<"再见噢!"<<endl;
            break;
        case 1:
            IL. clear();
            break;

        case 2:
            cout<<"你要入栈的元素为:"<<endl;
            cin>>item;
            ok=IL.push(item);
            if(ok==true)
            cout<<"入栈操作成功!"<<endl;
            break;

        case 3:
            ok=IL.pop(item);
            if(ok==true)
            {
                cout<<"出栈操作成功,此时的出栈的元素为:"<< item <<endl;
            } 
            break;

        case 4:
            ok=IL. high (item);
                if(ok==true)
                {
                    cout << "栈顶的元素为:" << item << endl;
                }
            break;

        case 5:
            IL.isEmpty();
            break;

        case 6:
            IL.isFull();
            break;

        case 7:
            IL.display();
            break;

        case 8:
            ok=IL.destory();
            if(ok==true)
            {
                cout<<"销毁操作成功!"<<endl;
            }
            break;

        case 9:
            cout<<"你所要创建顺序栈的长度为:"<<endl;
            cin>>item;
            ok=IL.create(item);
            if(ok==true)
            {
                cout <<"创建顺序栈操作成功!"<<endl;
            }
            break;

        case 10:
            
                cout<<"该链式栈的长度为:"<<IL.length();
                cout<<endl;
    
            break;
        
        default: cout <<"您的选择错误!"<<endl;
        }

    } while (choice != 0);

}

    
    

  • 写回答

2条回答 默认 最新

  • Eleven 2021-04-25 15:40
    关注

    你入栈的时候并没有将新增的元素链入链表中
    至少应该有类型下面的操作

    bool push(const T item)
        {
            Link <T>* tmp = new Link <T>;
            Link <T>* next = top;
    
            top = tmp;
            top->data = item;
            top->next = next;
            
            size++;
            return true;
        }
    评论

报告相同问题?

悬赏问题

  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件