C++数据结构
https://www.runoob.com/cplusplus/cpp-data-structures.html
一、 数据结构
结构定义
关键字来定义
例如:
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
定义该类型变量可以直接使用关键字 Books
普通定义 struct
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
结构可作为函数参数
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books book );
// 声明一个结构体类型 Books
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
Books Book1; // 定义结构体类型 Books 的变量 Book1
Books Book2; // 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy( Book1.title, "C++ 教程");
strcpy( Book1.author, "Runoob");
strcpy( Book1.subject, "编程语言");
Book1.book_id = 12345;
// Book2 详述
strcpy( Book2.title, "CSS 教程");
strcpy( Book2.author, "Runoob");
strcpy( Book2.subject, "前端技术");
Book2.book_id = 12346;
// 输出 Book1 信息
printBook( Book1 );
// 输出 Book2 信息
printBook( Book2 );
return 0;
}
void printBook( struct Books book )
{
cout << "书标题 : " << book.title <<endl;
cout << "书作者 : " << book.author <<endl;
cout << "书类目 : " << book.subject <<endl;
cout << "书 ID : " << book.book_id <<endl;
}
指向结构的指针
struct_pointer = &Book1;
struct_pointer->title;//调用结构中的变量与之前有所不同
二、 C++类和对象
class Box
{
public:
double length; // 盒子的长度
double breadth; // 盒子的宽度
double height; // 盒子的高度
};
Box Box1; // 声明 Box1,类型为 Box
Box Box2; // 声明 Box2,类型为 Box
举个栗子🌰
#include <iostream>
using namespace std;
class Box
{
public:
double length; // 长度
double breadth; // 宽度
double height; // 高度
// 成员函数声明
double get(void);
void set( double len, double bre, double hei );
};
// 成员函数定义
double Box::get(void)
{
return length * breadth * height;
}
void Box::set( double len, double bre, double hei)
{
length = len;
breadth = bre;
height = hei;
}
int main( )
{
Box Box1; // 声明 Box1,类型为 Box
Box Box2; // 声明 Box2,类型为 Box
Box Box3; // 声明 Box3,类型为 Box
double volume = 0.0; // 用于存储体积
// box 1 详述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 2 详述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// box 1 的体积
volume = Box1.height * Box1.length * Box1.breadth;
cout << "Box1 的体积:" << volume <<endl;
// box 2 的体积
volume = Box2.height * Box2.length * Box2.breadth;
cout << "Box2 的体积:" << volume <<endl;
// box 3 详述
Box3.set(16.0, 8.0, 12.0);
volume = Box3.get();
cout << "Box3 的体积:" << volume <<endl;
return 0;
}
三、队列实现与应用
栗子🌰
https://jingyan.baidu.com/article/b2c186c80ff8b7c46ff6ff50.html
#include <queue>
#include <iostream>
using namespace std;
int main()
{
queue<int> myQ;
for(int i=0; i<10; i++)
myQ.push(i);
cout<<"myQ size is: "<<myQ.size()<<endl;
for(int i=0; i<myQ.size(); i++)
{
cout << myQ.front()<<endl;
myQ.pop();
}
cout<<"myQ size is: "<<myQ.size()<<endl;
return 0;
}
基本操作
queue的基本操作有:
入队,如例:q.push(x); 将x接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
源码
https://www.cnblogs.com/liuamin/p/6547253.html
循环队列
#ifndef QUEUE_H
#define QUEUE_H
#include<cassert>
#include<iostream>
using namespace std;
template<typename T>
class Queue
{
public:
Queue(int maxsize = 10);
Queue(const Queue<T>& rhs);
Queue<T>& operator=(const Queue<T>& rhs);
~Queue();
public:
bool empty() const;
bool IsFull() const;
int size() const;
void push(const T& data);
void pop();
T& front();
T front() const;
T& back();
T back() const;
private:
T *array;
int Front;
int rear;
int capacity;
};
template<typename T>
Queue<T>::Queue(int maxsize) :Front(0), rear(0),capacity(maxsize)
{
array = new T[maxsize];
assert(array != NULL); //存储分配失败则退出;
}
template<typename T>
Queue<T>::Queue(const Queue<T>& rhs) :Front(rhs.Front), rear(rhs.rear),capacity(rhs.capacity)
{
array = new T[capacity];
for (int i = 0; i != (this->size()); i++)
array[i] = rhs.array[i];
}
template<typename T>
Queue<T>& Queue<T>::operator=(const Queue<T>& rhs)
{
if (this != &rhs)
{
delete[] array;
capacity = rhs.capacity;
Front = rhs.Front;
rear = rhs.rear;
array = new T[capacity];
for (int i = 0; i != (this->size()); i++)
array[i] = rhs.array[i];
}
return *this;
}
template<typename T>
Queue<T>::~Queue()
{
delete[] array;
}
template<typename T>
bool Queue<T>::empty() const
{
return Front == rear; //此处为循环队列,当front==rear时为空。
}
template<typename T>
bool Queue<T>::IsFull() const
{
return(rear + 1) % capacity == Front; //当(rear+1)%capacity==front为满,因为为满时差一个元素,但是可能rear>front,也可能rear<front.
}
template<typename T>
int Queue<T>::size() const
{
return (rear - Front + capacity) % capacity;
}
template<typename T>
void Queue<T>::push(const T& data)
{
if (!IsFull())
{
array[rear] = data;
rear = (rear + 1) % capacity;
}
else //当队列满了之后可进行扩容
{
T *newarray=new T[ 2*capacity ];
for (int i = 0; i != 2*capacity&&!this->empty(); i++)
{
newarray[i] =this-> front();
this->pop();
}
delete [ ] array;
array = newarray;
Front = 0;
array[rear] = data;
rear =this->rear+1;
capacity = 2*capacity;
}
}
template<typename T>
void Queue<T>::pop()
{
if (!empty())
{
//array[Front].~T(); //将队头元素析构掉
Front = (Front + 1) % capacity;
}
else
cout<<"empty queue!"<<endl;
}
template<typename T>
T& Queue<T>::front()
{
if (empty())
cerr << "Error, queue is empty!";
return array[Front];
}
template<typename T>
T Queue<T>::front() const
{
if (empty())
cerr << "Error, queue is empty!";
return array[Front];
}
template<typename T>
T& Queue<T>::back()
{
if (empty())
cerr << "Error, queue is empty!";
return array[rear-1]; //rear类似与尾后指针
}
template<typename T>
T Queue<T>::back() const
{
if (empty())
cerr << "Error, queue is empty!";
return array[rear-1];
}
#endif // QUEUE_H