第三章 栈和队列

来源:互联网 发布:药品销售数据分析 编辑:程序博客网 时间:2024/05/21 09:57

 第三章  栈和队列

一.

1.栈:限定仅在表尾进行插入和删除操作的线性表(允许插入和删除的一端称为栈顶;另一端称为栈底)。

2.空栈:不含任何数据元素的栈。

3.在任何时候出栈的元素都只能是栈顶元素,即最后入栈者最先出栈,具有后进先出的特性。

4.栈的抽象数据类型定义:

(1)Push(输入:元素值x;输出:如果插入不成功,则抛出异常)功能:入栈操作,在栈顶插入一个元素x

(2)Pop(输入:无;输出:如果删除成功,返回被删元素值,否则抛出异常)功能:出栈操作,删除栈顶元素。

(3)GetTop(输入:无;输出:若栈不空,返回当前的栈顶元素值)功能:取栈顶元素,读取当前的栈顶元素。

(4)Empty(输入:无;输出:如果栈为空,返回1,否则返回0)功能:判空操作,判断栈是否为空。

 

5.(1)顺序栈的实现:

模板:

Const int stacksize=10;

Template<class dt>

Class seqstack

{

 public:

     seqstack();

     ~seqstack(){}

     void Push(dt x);

     dt Pop();

     dt GetTop();

     int Empty();

     private:

            dt data[stacksize];

            int top;

};

 

(2).顺序栈:

(1)入栈算法Push

Template<class dt>

Void seqstack<dt>::Push(dt x)

{

If(top==stacksize-1)throw “上溢”;

Data[++top]=x;

}

(2)出栈算法Pop:

Template<class dt>

Dt seqstack<dt>::Pop()           

{

If(top==-1)throw “下溢”;

X=data[top--];

Return x;

}

6.链栈:

(1)入栈算法Push:

Template<class dt>

Void linkstack<dt>::Push(dt x)

{

S=new Node;s->data=x;s->next=top;top=s;

}                           

(2)出栈算法Pop:

Template<class dt>

Dt linkstack<dt>::Pop()

{

If(top==NULL)throw “下溢”;

X=top->data;p=top;

Top=top->next;delete p;return x;

}

二.队列

1.队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表。

2.队列中的元素具有先进先出的特性。

3.队列的抽象数据类型定义

(1)EnQueue(输入:元素值x;输出:如果插入不成功,则抛出异常)功能:入队操作,在对尾插入一个元素。

(2)DeQueue(输入:无;输出:如果删除成功,返回被删元素值,否则,抛出删除异常)

功能:出队操作,删除队头元素。

(3)GetQueue(输入:无;输出:若队列不空,返回队头元素)功能:读取队头元素。

(5)Empty(输入:无;输出:如果队列为空,返回1,否则返回0)功能:判空操作,判断队列是否为空。

4.(1)模板:

Const int Queuesize=100;

Template<class Data Type>

Class cirQueue

{

Public:

cirQueue(){front=rear=Queuesize-1;}

~cirQueue(){}

Void EnQueue(Data Typex);

Dt DeQueue();

De GetQueue();

Int Empty(){front==rear?return 1:return 0;}

Private:

Dt data[Queuesize];

Int front,rear;

};

(2)循环队列:

(1)入队算法EnQueue

template<class Data Type>

void cirQueue<Data Type>::EnQueue(Data Typex)

{

if((rear+1)%Queuesize==front)throw “上溢”;

rear=(rear+1)%Queuesize;

data[rear]=x;

}

(2)出队算法DeQueue:

template<class Data Type>

dt cirQueue<Data Type>::DeQueue()

{

Ii(rear==front)throw “下溢”;

front=(front+1)%Queuesize;

return data[front];

}

(3)读取队头元素算法GetQueue:

template<class Data Type>

dt cirQueue<Data Type>::GetQueue()

{

if(rear==front)throw “下溢”;

i=(front+1)%Queuesize;

return data[i];

}

5.链队列

(1)构造函数算法linkQueue

template<class Data Type>

linkQueue<Data Type>::linkQueue()

{

s=new Node; s->next=NULL;front=rear=s;

}

(2)入队算法EnQueue

template<class Data Type>

void linkQueue<Data Type>::EnQueue(Data Typex)

{

s=new Node;s->data=x;

s->next=NULL;rear->next=s;

rear=s;

}

(3)出队算法DeQueue

template<class Data Type >

dt linkQueue<Data Type>::DeQueue()

{

if(rear==front)throw “下溢”;

p=front->next;x=p->next;

front->next=p->next;

if(p->next==NULL) rear=front;

delete=p;return x;

}

 

 

第三章关联实验 顺序栈和链队列的操作

一.实验目的

1.掌握栈的顺序存储结构;验证顺序栈及其基本操作的实现;验证栈的操作特性。

2.掌握队列的链接存储结构;验证链队列的存储结构和基本操作的实现;验证队列的操作特性。

二.问题描述

1.建立一个空栈;对已建立的栈进行插入、删除、取栈顶元素等基本操作。

2.建立一个空队列;对已建立的队列进行插入、删除、取队列元素等基本操作。

三.实验要求

1.根据栈的操作特性顺序实现栈的操作;编写适当的主程序代码验证栈的相关操作。

2.定义链队列的数据类型——链队列类LinkQueue,包括入队、出队、取队头元素等基本操作;链队列类LinkQueue的定义以及基本操作的算法请参见教材3.2.3节。

 四.实验环境

PC微机

DOS操作系统或Windows操作系统

Turbo C程序集成环境或Visual C++程序集成环境

五.实验步骤及结果

1.根据栈的操作特性顺序实现栈的操作;编写适当的主程序代码验证栈的相关操作。

1.建立一个SeqStack_h头文件

#ifndef SeqStack_H

#define SeqStack_H

const int StackSize=10;

template<class DataType>

class SeqStack

{

      public:

      SeqStack();

      ~SeqStack(){}

      void Push(DataType x);

      DataType Pop();

      DataType GetTop();

      int Empty();

      private:

             DataType data[StackSize];

             int top;

};

#endif

2.建立一个SeqStack.cpp文件

#include"SeqStack.h"

template<class DataType>

SeqStack<DataType>::SeqStack()

{

      top=-1;

}

template<class DataType>

void SeqStack<DataType>::Push(DataType x)

{

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

      top++;

      data[top]=x;

}

template<class DataType>

DataType SeqStack<DataType>::Pop ()

{

      DataType x;

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

      x=data[top--];

      return x;

}

template<class DataType>

DataType SeqStack<DataType>::GetTop ()

{

      if(top!=-1)

         SeqStack_H

    return data[top];

}

template<class DataType>

int SeqStack<DataType>::Empty ()

{

      if(top==-1)return 1;

      else return 0;

}

3、建立SeqStack_main文件

#include<iostream>

using namespace std;

#include"SeqStack.cpp"

void main()

{

      SeqStack<int>S;

      if(S.Empty ())

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

      else

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

      cout<<"1510执行入栈操作"<<endl;

      S.Push (15);

      S.Push (10);

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

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

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

      S.Pop ();

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

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

}

 

实验二:建立一个空队列;对已建立的队列进行插入、删除、取队列元素等基本操作。

1、新建一个LinkQueue文件如图:

#ifndef LinkQueue_H

#define LinkQueue_H

template<class DataType>

struct Node

{

DataType data;

Node<DataType>*next;

};

template<class DataType>

class LinkQueue

{

public:

LinkQueue()

~LinkQueue();

void EnQueue(DataType x);

DataType DeQueue();

DataType GetQueue();

int Empty();

private:

   Node<DataType>*front,*rear;

};

#endif;

2、新建一个LinkQueue.cpp文件如图:

#include" LinkQueue.h"

template<class DataType>

 LinkQueue<DataType>:: LinkQueue()

{

Node<DataType>*s=NULL;

s=new Node<DataType>;

s->next=NULL;

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>

void LinkQueue<DataType>:: EnQueue(DataType x)

{

Node<DataType>*s=NULL;

s=new Node<DataType>;

s->data=x;

s->next=NULL;

rear->next=s;rear=s;

}

template<class DataType>

DataType LinkQueue<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;

delete p;

return x;

}

template<class DataType>

DataType LinkQueue<DataType>:: GetQueue()

 {

       if(front!=rear)

       return front->next->data;

 }

template<class DataType>

int LinkQueue<DataType>::Empty ()

{

      if(front=rear)

      return 1;

      else

      return 0;

}

3、新建一个LinkQueue_main主文件如图:

#include<iostream>

using namespace std;

#include"LinkQueue.cpp"

void main()

{

      LinkQueue<int>Q;

      if(Q.Empty ())

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

      else

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

      cout<<"元素25执行入队操作:"<<endl;

      try

      {

               Q.EnQueue (2);

               Q.EnQueue (5);

      }

      catch(char*wrong)

      {

             cout<<wrong<<endl;

      }

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

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

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

      try

      {

             Q.DeQueue ();

      }

catch(char*wrong)

{

      cout<<wrong<<endl;

}

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

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

}

 

 

 

0 0