线性表及栈与队列的操作实现

181 阅读1分钟

题目一:

1:问题

设计一个点类Point,它有两个私有数据成员x和y,表示点的坐标。另一个类为直线类Line,它有三个私有数据成员A、B和C,表示直线方程Ax+By+C=0。这两个类中都说明了一个友元函数dist(),用于计算一个点到直线的距离。

2.解题思路

利用点和直线类共同的友元函数来计算距离

3.代码实现

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
class Line;
class Point
{
	private:
		float x,y;
	public:
        void in()
        {
         	cin>>x>>y;
        }
        friend void dist(Point &p,Line &l);    
		
};
class Line
{
	private:
	   float a,b,c;
	public:
       friend void dist(Point &p,Line &l); 
	   void in()
	   {
	   	cin>>a>>b>>c;
	   }
	  
};

void dist(Point &p,Line &l)
{
	float d;
	d=(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);
	if(d<0)
	d=-d;
	printf("%.2f",d);
}
int main()
{
	class Point point;
	class Line line;
	point.in();
    line.in();
    dist(point,line);
	return 0;
}

4.问题及解决方法

问题:如何实现公式中的绝对值 解决:加入判断语句

5.心得:

友元函数中要用到的类定义如果在后面,要先在前面声明。

线性表及栈与队列的操作实现

题目内容:

针对线性表或栈或队列,编程实现选择顺序或链式存储结构下数据结构建立,元素插入,删除等基本操作。要求解释实现过程,演示实际例子及运行结果。

算法描述:

线性表

由结点集N以及定义在结点集N上的线性关系R

(1)有一个唯一的开始节点,无前驱,有唯一后继

(2)对于有限集N 存在一个唯一的终止结点,无后继,有唯一前驱

(3)其他为内部结点,有唯一前驱和唯一后继

(4)线性表的节点个数称为长度,长度为0线性表称为空表

(5) 线性关系R简称前驱关系,应具有反对称和传递性

栈:

栈:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

特点:先进后出

选择顺序栈的实现,顺序栈的类包括构造函数,析构函数,判断栈是否为空,判断栈是否为满,将栈清空,计算栈的长度,入栈,出栈,返回栈顶元素操作的函数实现。主函数为输入俩个数,并且压入栈,出栈一个数赋值给c,返回栈顶元素给d,输出c,d。

顺序队列

两个变量指向队头和队尾,但是如果按顺序表的实现方法,如果从数组后面入队,出队列时间代价O(n)因为需要把前面的元素向前移动一个位置,入队列时间代价O(1)

如果不进行元素的移动,会出现假上溢出,就是front和rear都指向队尾,尽管此时队列为空,但也无法插入元素,所以引入循环队列

线性队列在不断入队出队后,会有空间剩余,所以构造为环形队列,某一个元素的直接后继是( x + 1 ) % m S i z e (x+1)%mSize(x+1)%mSize,但是rear=front时无法判断队列满还是队列空,所以往往空出一个位置,以( r e a r + 1 ) % m S i z e = = f r o n t (rear+1)%mSize==front(rear+1)%mSize==front作为队列满的标志

代码

#include<iostream>
#include<cstring>
using namespace std;
template<class Type>
class SeqStack
{
	public:
		SeqStack(int size);//构造函数 
		~SeqStack(){delete base;}//析构函数 
		int IsEmpty()const{return top==0;} //判断栈是否为空 
		int IsFull(){return top==maxsize;}//判断栈是否为满 
		void SeqStackClear(){top=0;}//将栈清空 
		int SeqStackLength(){return top;}//计算栈的长度 
		void Push(Type &e);//入栈操作 
		Type Pop();//出栈操作 
		Type GetTop();//返回栈顶元素 
	private:
		int maxsize;
		Type *base;
		int top;
}; 

template<class Type>
SeqStack<Type>::SeqStack(int size):maxsize(size){
base=new Type[maxsize];
if(base==NULL)
{
cout<<"分配内存失败";
exit(0);	
}	
top=0;
}

template<class Type>
void SeqStack<Type>::Push(Type & e){
	if(IsFull()){
		cout<<"栈空间已满"<<endl;
		exit(0);	 
	}
	 else{base[top++]=e;}
} 

template<class Type>
Type SeqStack<Type>::Pop(){
	if(IsEmpty())
	{
		cout<<"栈为空"<<endl;
		exit(0); 
	}
	else return base[--top];
}
template<class Type>
Type SeqStack<Type>::GetTop(){
	if(IsEmpty())
	{
		cout<<"栈为空"<<endl;
		exit(0); 
	}
	else
	return base[top-1];
}

int main()
{
	SeqStack<int> stack(10);
	int a,b,c,d;
	cin>>a>>b;
	stack.Push(a);//将a入栈 
	stack.Push(b);//将b入栈 
	c=stack.Pop();
	d=stack.GetTop();
	cout<<c<<" "<<d<<endl;
	return 0; 
}

实验结果:

输入: 1 2 输出: 2 1