数据结构实验报告二(栈、队列与杨辉三角)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》
实验报告
项目名称栈、队列与杨辉三角
专业班级软件工程工科试验班
学号3903120128
姓名谢江
实验成绩:
批阅教师:
2012年5月22 日
实验1《单链表的建立与约瑟夫问题》实验学时:实验地点:寝室与实验室实验日期:2012年5月22日
1.需求分析
实验2 主要是关于栈。
队列的建立以及杨辉三角问题的解决(队列运用)
2.概要设计以及详细设计
(1)栈
class Stack
{
public:
Stack();
bool empty();//判断栈是否为空
T peek();//显示栈顶元素
void push(T value);//入栈
T pop();//出栈
int getSize();//当前栈中元素的数量
private:
T *elements;//数组指针
int size;//栈中的元素数量
int capacity;//栈的容量
void ensureCapacity();//确认栈的容量是否大于元素数量
};
(2)队列
class Queue
{
public:
Queue();
void enQueue(T element);//元素入队
T deQueue();//元素出对,如果没有元素,抛出异常
int getSize();//获取队列大小
private:
LinkedList<T> list;//定义表
};
3.调试分析
内容包括:
调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;经验和体会等。
个人标记:
能建立顺序栈,以及链表顺序队列,对于比较复杂的链栈、循环队列等比较不熟悉,杨辉三角问题存在问题此次报告暂时不交,还有就是抛出异常的问题,例如:T deQueue()throw (runtime_error);//元素出对,如果没有元素,抛出异常
会提示警告:
C++ exception specification ignored except to indicate a function is not_declspec(nothrow)
于是尽可能用if(…)throw runtime_error,就不报错了
4.附录
(1)栈
Stack.h
*****************************
//采用数组的方式进行栈的操作
#ifndef STACK_H
#define STACK_H
template<typename T>
class Stack
{
public:
Stack();
bool empty();//判断栈是否为空
T peek();//显示栈顶元素
void push(T value);//入栈
T pop();//出栈
int getSize();//当前栈中元素的数量
private:
T *elements;//数组指针
int size;//栈中的元素数量
int capacity;//栈的容量
void ensureCapacity();//确认栈的容量是否大于元素数量};
template<typename T>
Stack<T>::Stack()
{
capacity = 10;//初始栈的大小
size = 0;//初始元素的数量
elements = new T[capacity];//建立指针
}
template<typename T>
bool Stack<T>::empty()
{
if(size == 0)
return true;
else
return false;
}
template<typename T>//只显示栈顶元素并不出栈
T Stack<T>::peek()
{
return elements[size - 1];
}
template<typename T>
void Stack<T>::ensureCapacity()
{
if(size >= capacity)//如果满足进行指针的更换
{
T *old = elements;
capacity = size + 1;
elements = new T[capacity];
for(int i = 0; i < size; i++)elements[i] = old[i];
delete old;
}
}
template<typename T>
void Stack<T>::push(T value)
{
ensureCapacity();//入栈前进行栈是否溢出的判断
elements[size++] = value;
}
template<typename T>
T Stack<T>::pop()
{
return elements[--size];
}
template<typename T>
int Stack<T>::getSize()
{
return size;
}
#endif
*************************************
TestStack.cpp
*************************************
#include<iostream>
#include"Stack.h"
using namespace std;
int main()
{
Stack<int> intS;
cout << "before push size of intStack is: " << intS.getSize() << endl;//统计入栈前栈的大小
for(int i = 0; i < 10; i++)
{
int num;
cout << "enter num: ";
cin >> num;
intS.push(num);
}
cout << "now size of intStack is: " << intS.getSize() << endl;//统计入栈后栈的大小
while(!intS.empty())
{
cout << intS.pop() << " out " << endl;
}
cout << "after pop size of intStack is: " << intS.getSize() << endl;//出站后栈的大小
system("pause");
return 0;
}
##################################################
(2)队列
LinkedList.h
******************************************
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include<stdexcept>
using namespace std;
template<typename T>class Queue;//前视定义,否则无法友元
template<typename T>
class Node
{
public :
T element;//节点数据域
Node<T> *next;//指向下指针
Node()
{
next = NULL;
}
Node(T element)
{
this -> element = element;
next = NULL;
}
};
template<typename T>
class LinkedList
{
public:
LinkedList();
T removeFirst();//移除并返回表头元素
void addLast(T element);//尾端插入新元素
int getSize();//获取表的大小
private:
Node<T> *head, *tail;//定义头节点、尾节点
int size;
};
template<typename T>
LinkedList<T>::LinkedList()//初始化链表NULL
{
head = tail = NULL;
size = 0;
}
template<typename T>
void LinkedList<T>::addLast(T element)
{
if(tail == NULL)
{
head = tail = new Node<T>(element);
}
else
{
tail ->next = new Node<T>(element);
tail = tail ->next;
}
size++;//作添加工作,size++
}
template<typename T>
T LinkedList<T>::removeFirst()
{
if(size == 0)
throw runtime_error("No elements");//抛出异常情况else
{
//删除并返回头节点元素,把下一节点作为新的头节点
Node<T> *temp = head;
head = head ->next;
if(head == NULL)tail = NULL;
size--;//作删除工作,size--
T element = temp ->element;
delete temp;
return element;
}
}
template<typename T>
int LinkedList<T>::getSize()//返回size
{
return size;
}
#endif
****************************************
Queue.h
***********************************
#ifndef QUEUE_H
#define QUEUE_H
#include"LinkedList.h"
#include<stdexcept>
using namespace std;
template<typename T>
class Queue
{
public:
Queue();
void enQueue(T element);//元素入队
T deQueue();//元素出对,如果没有元素,抛出异常
int getSize();//获取队列大小
private:
LinkedList<T> list;//定义表
};
template<typename T>
Queue<T>::Queue(){}//空的构造函数
template<typename T>
void Queue<T>::enQueue(T element)
{
list.addLast(element);//入队(后插)
}
template<typename T>
T Queue<T>::deQueue()
{
return list.removeFirst();//出对(前删)
}
template<typename T>
int Queue<T>::getSize()
{
return list.getSize();
}
#endif
******************************************* TestQueue.cpp
*******************************************
#include<iostream>
#include<stdexcept>
#include"Queue.h"
using namespace std;
int main()
{
Queue<int> q;
cout << "before enQueue size is: " << q.getSize() << endl;
for(int i = 0; i < 10; i++)
{
q.enQueue(i);
cout << i << " enter queue" << endl;
}
cout << "after enQueue size si: " << q.getSize() << endl;
while(q.getSize()!=0)
{
cout << q.deQueue() << "out queue" << endl;
}
cout << "after deQueue size is: " << q.getSize() << endl;
system("pause");
return 0;
}。