数据结构实验报告(三)

来源:互联网 发布:java开发手游 编辑:程序博客网 时间:2024/06/05 09:07

数据结构实验报告(三)

一、实验名称

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

二、实验目的

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

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

三、实验内容

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

分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。

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

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

四、详细设计(C++)

源程序代码

顺序栈:

#include<iostream>using namespace std;class MyStack{public:MyStack(int size);~MyStack();bool stackEmpty();bool stackFull();void clearStack();int stackLength();bool push(char elem);bool pop(char &elem);void stackTraverse(bool isFromButtom);private:char *m_pBuffer;int m_iSize;int m_iTop;};MyStack::MyStack(int size){m_iSize=size;m_pBuffer=new char[m_iSize];m_iTop=0;}MyStack::~MyStack(){delete[]m_pBuffer;}bool MyStack::stackEmpty(){if(m_iTop==0){return true;}return false;}bool MyStack::stackFull(){if(m_iTop==m_iSize){return true;}return false;}void MyStack::clearStack(){m_iTop=0;}int MyStack::stackLength(){return m_iTop;}bool MyStack::push(char elem){if(stackFull()){return false;}m_pBuffer[m_iTop]=elem;m_iTop++;return true;}bool MyStack::pop(char &elem){if(stackEmpty()){return false;}m_iTop--;elem=m_pBuffer[m_iTop];return true;}void MyStack::stackTraverse(bool isFromButtom){if(isFromButtom){for(int i=0;i<m_iTop;i++){cout<<m_pBuffer[i]<<",";}}else{for(int i=m_iTop-1;i>=0;i--){cout<<m_pBuffer[i]<<",";}}}int main(void){MyStack*pStack=new MyStack(5);pStack->push('h');pStack->push('e');pStack->push('l');pStack->push('l');pStack->push('o');pStack->stackTraverse(true);cout<<endl;pStack->stackTraverse(false);char elem;pStack->pop(elem);cout<<endl;cout<<elem<<endl;pStack->stackTraverse(true);cout<<endl;pStack->clearStack();cout<<pStack->stackLength()<<endl;if(pStack->stackEmpty()){cout<<"栈为空"<<endl;}if(pStack->stackFull()){cout<<"栈为满"<<endl;}delete pStack;pStack=NULL;system("pause");return 0;}

链栈:

#include<iostream>using namespace std;template<class DataType>struct Node{DataType data;Node<DataType> *next;};template<class DataType>class LinkStack{public:LinkStack(){top=NULL;}~LinkStack();void Push(DataType x);DataType Pop();DataType GetTop(){return top->data;}int Empty(){return top==NULL;}void Traverse();private:Node<DataType>*top;};template<class DataType>LinkStack<DataType>::~LinkStack(){Node<DataType>*q=NULL;while(top!=NULL){q=top->next;delete top;top=q;}}template<class DataType>void LinkStack<DataType>::Push(DataType x){Node<DataType>*s;s=new Node<DataType>;s->data=x;s->next=top;top=s;}template<class DataType>DataType LinkStack<DataType>::Pop(){Node<DataType>*p;if(top==NULL)throw"下溢";int x=top->data;p=top;top=top->next;delete p;return x;}template<class DataType>void LinkStack<DataType>::Traverse(){Node<DataType>*p;p=top->next;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;}int main(){LinkStack<int> s;if(s.Empty())cout<<"栈为空"<<endl;elsecout<<"栈未满"<<endl;s.Push(7);s.Push(4);s.Push(9);s.Push(2);s.Push(1);cout<<"完成入栈操作!此时栈中元素有:"<<endl;s.Traverse();cout<<"取栈顶元素为:"<<s.GetTop()<<endl;s.Pop();cout<<"出栈后的操作结果为:"<<endl;s.Traverse();system("pause");return 0;}

顺序队列:

#include<iostream>#include<stdlib.h>#include<string>#define MaxSize 100using namespace std;class Customer{public:Customer(string name=" ",int age=0);void printInfo() const;private:string m_strName;int m_iAge;};class MyQueue{public:MyQueue(int queueCapacity);virtual ~MyQueue();void ClearQueue();bool QueueEmpty() const;bool QueueFull() const;int QueueLength() const;bool EnQueue(Customer element);bool DeQueue(Customer &element);void QueueTraverse();private:Customer *m_pQueue;int m_iQueueLen;int m_iQueueCapacity;int m_iHead;int m_iTail;};Customer::Customer(string name,int age){m_strName=name;m_iAge=age;}void Customer::printInfo() const{cout<<"姓名:"<<m_strName<<endl;cout<<"年龄:"<<m_iAge<<endl;cout<<endl;}MyQueue::MyQueue(int queueCapacity){m_iQueueCapacity=queueCapacity;m_pQueue=new Customer[m_iQueueCapacity];ClearQueue();}MyQueue::~MyQueue(){delete[]m_pQueue;m_pQueue=NULL;}void MyQueue::ClearQueue(){m_iHead=0;m_iTail=0;m_iQueueLen=0;}bool MyQueue::QueueEmpty()const{if(m_iQueueLen==0){return true;}else{return false;}}int MyQueue::QueueLength() const{return m_iQueueLen;}bool MyQueue::QueueFull() const{if (m_iQueueLen==m_iQueueCapacity){return true;}return false;}bool MyQueue::EnQueue(Customer element){if(QueueFull()){return false;}else{m_pQueue[m_iTail]=element;m_iTail++;m_iTail=m_iTail%m_iQueueCapacity;m_iQueueLen++;return true;}}bool MyQueue::DeQueue(Customer &element){if(QueueEmpty()){return false;}else{element=m_pQueue[m_iHead];m_iHead++;m_iHead=m_iHead%m_iQueueCapacity;m_iQueueLen--;return true;}}void MyQueue::QueueTraverse(){for(int i=m_iHead;i<m_iQueueLen+m_iHead;i++){m_pQueue[i%m_iQueueCapacity].printInfo();}cout<<endl;}int main(void){MyQueue*p=new MyQueue(4);Customer c1("zhangsan",20);Customer c2("lisi",30);Customer c3("wangwu",40);p->EnQueue(c1);p->EnQueue(c2);p->EnQueue(c3);p->QueueTraverse();Customer c4(" ",0);p->DeQueue(c4);c4.printInfo();p->QueueTraverse();system("pause");return 0;}

链队列:

#include<iostream>using namespace std;class node{public:int data;node *next;node(){next=NULL;}node(int data1,node *next1){data=data1;next=next1;}~node(){}};class linkqueue{private:node *rear;node *front;public:linkqueue(){rear=front=new node();}~linkqueue(){}int length();bool empty(){return rear==front;}void inqueue(int e);void outqueue(int &e);void display();};int linkqueue::length(){int count=0;for(node *temp=front->next;temp!=rear;temp=temp->next){count++;}return count;}void linkqueue::inqueue(int e){node *temp=new node(e,NULL);rear->next=temp;rear=temp;}void linkqueue::outqueue(int &e){if(!empty()){node *temp1=front->next;e=temp1->data;front->next=temp1->next;if(rear==temp1){rear=front;}delete temp1;}}void linkqueue::display(){for(node*temp=front->next;temp!=rear->next;temp=temp->next){cout<<temp->data<<" ";}cout<<endl;}int main(){int i,x,e;linkqueue a;cout<<"输入要建立队列的长度:"<<endl;cin>>x;for(i=1;i<=x;i++){cout<<"请输入队列中第"<<i<<"个数据:"<<endl;cin>>e;a.inqueue(e);}cout<<"显示队列中的元素为:"<<endl;a.display();cout<<"输入出列元素个数:";cin>>x;cout<<"出列元素为:";for(i=1;i<=x;i++){a.outqueue(e);cout<<e<<" ";}cout<<endl;cout<<"显示队列中的元素为:"<<endl;a.display();system("pause");return 0;}

进制转换:

#include<iostream>using namespace std;template<class T>class node{public:T data;node<T>* link;node(const T&el,node<T>*ptr=NULL){data=el;    link=ptr;}};template<class T>class pstack{private:node<T>*top;int size;public:pstack(T s=0){top=NULL;size=0;}~pstack(){clear();}void clear(){while(top!=NULL){node<T>*temp=top;top=top->link;delete temp;}size=0;}void push(const T item){node<T>* tmp=new node<T>(item,top);top=tmp;size++;}T pop(){T temp;if(size==0){cout<<"栈为空,不能进行删除!"<<endl;exit(0);}else{temp=top->data;node<T>*tmp=top;top=top->link;delete tmp;size--;}return temp;}T Top(){T temp;if(size==0){cout<<"栈为空,不能进行删除!"<<endl;    exit(0);}else{temp=top->data;}return temp;}bool isempty(){if(size==0) return true;elsereturn false;}};int main(){int a,b,i=1,d;pstack<int> c;while(i!=2){cout<<"输入要转换的十进制数:";cin>>a;cout<<"输入转换为的进制:";cin>>b;if(b>=2&&b<=9){while(a){d=a%b;c.push(d);a=a/b;}while(!c.isempty()){cout<<c.pop();}cout<<endl;}else{cout<<"输入错误!!"<<endl;}cout<<"1、继续\n";cout<<"2、退出\n";cout<<"请选择:";cin>>i;system("cls");}}

五、运行与测试结果








六、总结与心得

        这次实验,我更加熟悉了栈与队列的内容及相关应用。通过比较,我知道了当栈的使用过程中元素个数变化较大时,用链栈是最适宜的;反之,应该采用顺序栈。而循环队列和链队列的空间性能的比较与顺序栈和链栈的空间性能比较类似,只是循环队列不能像顺序栈那样共享空间,通常不能在一个数组中存储两个循环队列。我还能运用栈的相关知识解决进制转换问题。通过查阅资料,还了解了更多与栈和队列的相关应用,收获颇多。






原创粉丝点击