实验2:栈和队列的基本操作实现及其应用

一、实验目的

1、   熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。

2、      学会使用栈和队列解决实际问题。

二、实验内容

1、自己确定结点的具体数据类型和问题规模:

分别建立一个顺序栈和链栈,实现栈的压栈(插入元素)和出栈(删除元素)操作。

分别建立一个顺序队列和链队列,实现队列的入队和出队操作。

2、设计算法并写出代码,实现一个十进制数转换成2进制数。

3、选做题(*

设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。

三、实验步骤

扫描二维码关注公众号,回复: 561195 查看本文章

1、依据实验内容分别说明实验程序中用到的数据类型的定义;

2、相关操作的算法表达;

3、完整程序;

4、总结、运行结果和分析。

5、总体收获和不足,疑问等。

四、实验要求

1、   按照数据结构实验任务书,提前做好实验预习与准备工作。

2、   加“*”为选做题。做好可加分。

3、   严格按照数据结构实验报告模板和规范,及时完成实验报告。

4、   在个人主页上发文章提交作业。

5、   实验课会抽查3-5人,希望你可以被查到!


1、自己确定结点的具体数据类型和问题规模:

分别建立一个顺序栈和链栈,实现栈的压栈(插入元素)和出栈(删除元素)操作。

答:

完整代码:

#ifndefSeqStack_H                                            //避免重复包含头文件

# defineSeqStack_H                                          

const intStackSize=10;                                       //栈最多有10个元素

template<class DataType>

class SeqStack

{

    private:

        DataType data[StackSize];                             //存放栈元素的数组

        int top;                                              //栈顶指针

    public:

        SeqStack();

        ~SeqStack(){}

        void Push(DataType x);                                //入栈操作,将元素X入栈   

        DataType Pop();                                       //出栈操作,将栈顶元素弹出

        DataType GetTop()                                     //取出栈顶元素(并不删除)                                                

        int Empty()                                           //判断栈是否为空                                                 

};

#endif

 

 

#include"SeqStack.h"                                             //引入类的声明 以下是类的成员函数定义

template<class DataType>

SeqStack<DataType>::SeqStack()

{

    top=-1;

}

 

template<class DataType>

SeqStack<DataType>::Push(DataTypex)

{

    if(top==StackSize-1) throw"上溢";

    top++;

    data[top]=x;

}

 

template<class DataType>

SeqStack<DataType>::Pop()

{

    DataType x;

    if(top==-1) throw"下溢";

    x=data[top--];

    return x;

}

 

template<class DataType>

SeqStack<DataType>::GetTop()

{

    if(top!=-1)

        return data[top];

}

 

template<class DataType>

SeqStack<DataType>::Empty()

{

    if(top==-1) return 1;

    else return 0;

}

 

#include<iostream.h>

#include"SeqStack.cpp"

void main()

{

    SeqStack<int> S;                           //创建模板类的实例

    if(S.Empty())

        cout<<"栈为空"<<endl;

    else

        cout<<"栈非空"<<endl;

    cout<<"对15和10执行入栈操作"<<endl;

    S.Push(15);

    S.Push(10);

    cout<<"栈顶元素为:"<<endl;

    cout<<"S.GetTop()"<<endl;

    cout<<"执行一次出栈操作"<<endl;

    S.Pop();

    cout<<"栈顶元素为:"<<endl;

    cout<<S.GetTop()<<endl;

}


分别建立一个顺序队列和链队列,实现队列的入队和出队操作。

答:

完整代码:

#ifndefLinkQueue_H

#defineLinkQueue_H

template<class DataType>                                         //定义链队列的结点

structNode

{

       DataType data;

       Node<DataType> *next;

};

 

template<class DataType>

classLinkQueue

{

       public:

              LinkQueue();

              ~LinkQueue();

              void EnQueue(DataType x);                           //将元素X入队

              DataType DeQueue();                                    //将队头元素出队      

              DataType GetQueue();                                   //取链队列的队头元素     

              int Empty();                                            //判断链队列是否为空

       private:

              Node<DataType> *front,*rear;               //队头和队尾指针

};

#endif;

 

#include"LinkQueue.h"

 

template<class DataType>

LinkQueue<DataType>::LinkQueue()

{

       Node<DataType> *s=NULL;

       s=new Node<DataType>;

       s->next=s;

       front=rear=s;

}

 

template<class DataType>

LinkQueue<DataType>::~LinkQueue()

{

       Node<DataType> *p=NULL;

       while(front!=NULL)

       {

              p=front->next;

              delete front;

              front=p;

       }

}

template<class DataType>

voidLinkQueue<DataType>::EnQueue(DataType x)

{

       Node<DataType> *s=NULL;

       s=new Node<DataType>;

       s->data=x;

       s->next=NULL;                                                             //申请一个数据域为x的结点s

       s->next=NULL;

       rear->next=s;rear=s;                                             //将结点插入到队尾

}

 

template<class DataType>

DataTypeLinkQueue<DataType>::DeQueue()

{

       Node<DataType> *p=NULL;

       int x;

       if(rear==front) throw"下溢";

       p=front->next;

       x=p->data;                                                                   //暂存队头元素

       front->next=p->next;                                            //将队头元素所在结点摘链

       if(p->next==NULL) rear=front;                             //判断出队前队列长度是否为1

       delete p;

       return x;

}

 

template<class DataType>

DataTypeLinkQueue<DataType>::GetQueue()

{

       if(front!=rear)

              return front->next->data;

}

 

template<class DataType>

intLinkQueue<DataType>::Empty()

{

       if(front==rear)

              return 1;

       else

              return 0;

}

 

#include<iostream>

usingnamespace std;

#include"LinkQueue.cpp"

voidmain()

{

       LinkQueue<int> Q;

       if(Q.Empty())

              cout<<"队列为空"<<endl;

       else

              cout<<"队列非空"<<endl;

       cout<<"元素10和15执行入队操作:"<<endl;

       try

       {

              Q.EnQueue(10);

              Q.EnQueue(15);

       }

       catch(char* wrong)

       {

              cout<<wrong<<endl;

       }

       cout<<"查看队头元素:"<<endl;

       cout<<Q.GetQueue()<<endl;

       cout<<"执行出队操作:"<<endl;

       try

       {

              Q.DeQueue();

       }

       catch (char* wrong)

       {

              cout<<wrong<<endl;

       }

       cout<<"查看队头元素:"<<endl;

       cout<<Q.GetQueue()<<endl;

}
2、设计算法并写出代码,实现一个十进制数转换成2进制数。


<1>依据实验内容分别说明实验程序中用到的数据类型的定义;


答: void Push(DataType x);                        空类型                             


        void Decimaltor(int num);                    空类型             


        int top;                                                  整型
        const int StackSize=10;                         整型






<2>相关操作的算法表达;
答:(1)将十进制数转换为二进制数
v oidSeqStack<DataType>::Decimaltor(int num) 

    int k; 
    top=-1; 
    while(num!=0) 
    { 
        k=num%2;                                                                   //得到余数 
        Push(k);
        num=num/2;
    } 
    while(top!=-1)
       { 
        cout<<Pop();
    }


<3>完整代码:

答:

#include<iostream> 

usingnamespace std; 

 

constint StackSize=10; 

template<classDataType> 

classSeqStack 

{ 

    public: 

        SeqStack();                                             //构造函数,栈的初始化  

        ~SeqStack(){};                                         //析构函数

        void Push(DataType x);                          //将x入栈   

        DataType Pop();                                     //将栈顶元素弹出

        void Decimaltor(int num);                    //将十进制数转换为二进制数

    private: 

        DataType data[StackSize];                   //存放栈元素的数组  

        int top;                                                //栈顶指针,指示栈顶元素在数组中的下标

}; 

 

template<classDataType> 

SeqStack<DataType>::SeqStack() 

{ 

    top=-1; 

} 

 

template<classDataType> 

voidSeqStack<DataType>::Push(DataType x) 

{ 

    if(top==StackSize-1)throw"上溢"; 

    top++; 

    data[top]=x; 

} 



template<classDataType> 

DataTypeSeqStack<DataType>::Pop() 

{ 

    DataType x; 

    if(top==-1)throw"下溢"; 

    x=data[top--]; 

    return x; 

} 

template<classDataType> 

voidSeqStack<DataType>::Decimaltor(int num) 

{ 

    int k; 

    top=-1; 

    while(num!=0) 

    { 

        k=num%2;                                                                   //得到余数  

        Push(k); 

        num=num/2; 

    } 

    while(top!=-1)

       { 

        cout<<Pop(); 

    } 

} 

int main() 

{ 

    int num; 

    SeqStack<int>S; 

    cout<<"请输入一个十进制的数字:"<<endl; 

    cin>>num;    

    S.Decimaltor(num);  

    return 0; 

} 
2、设计算法并写出代码,实现一个十进制数转换成2进制数。

<1>依据实验内容分别说明实验程序中用到的数据类型的定义;

答: void Push(DataType x);                        空类型                             

        void Decimaltor(int num);                    空类型             

        int top;                                                  整型
        const int StackSize=10;                         整型



<2>相关操作的算法表达;
答:(1)将十进制数转换为二进制数


voidSeqStack<DataType>::Decimaltor(int num) 

{ 

    int k; 

    top=-1; 

    while(num!=0) 

    { 

        k=num%2;                                                                   //得到余数  

        Push(k); 

        num=num/2; 

    } 

    while(top!=-1)

       { 

        cout<<Pop(); 

    }

} 

4.运行结果



猜你喜欢

转载自blog.csdn.net/lum_0813/article/details/80085787