C++数据结构

队列

环形队列

Person.h代码

#ifndef PERSON_H
#define PERSON_H
#include <string>
#include <iostream>
using namespace std;
class Person{
public:
Person(string name="",int age=0);
~Person();
void PrintInfo() const;
string m_strName;
int m_iAge;
}; 
#endif // !PERSON_H


Person.cpp代码
#include "Person.h"
#include <iostream>
Person::Person(string name, int age){
m_strName = name;
m_iAge = age;
}
Person::~Person(){
}
void Person::PrintInfo() const{
cout << "姓名:" << m_strName << "年龄:" << m_iAge << endl;
}


MyQueue.h代码
#include "Person.h"
#include <string>
using namespace std;
class MyQueue{
public:
MyQueue(int mcapcity);
~MyQueue();
void EnQueue(Person *person);
void DeQueue();
bool IsEmpty();
bool IsFull();
void TraverselQueue();
int curLength;
int capcity;
int head;
int tail;
Person *p;
};


MyQueue.cpp代码
#include "MyQueue.h"
#include <iostream>
#include <string>
using namespace std;
MyQueue::MyQueue(int mcapcity){
capcity = mcapcity;
curLength = 0;
head = 0;
tail = 0;
p = new Person[mcapcity];
}
MyQueue::~MyQueue(){
delete []p;
p = NULL;
}
void MyQueue::EnQueue(Person *person){
if (curLength >= capcity){
cout << "添加失败,队列已满" << endl; 
return;
}
p[tail] = *person;
tail++;
tail = (tail+capcity) % capcity;
curLength++;
}
void MyQueue::DeQueue(){
if (curLength<=0){
cout << "删除失败,队列已空" << endl;
return;
}

head++;
head = head % capcity;
curLength--;
}
bool MyQueue::IsEmpty(){
return curLength = 0 ? true : false;
}
bool MyQueue::IsFull(){
return curLength = capcity ? true : false;
}
void MyQueue::TraverselQueue(){
for (int i = head; i < head + curLength; i++){
p[(i+capcity)%capcity].PrintInfo();
}
}




测试代码main函数
#include "MyQueue.h"
#include "Person.h"
int main(){
MyQueue *m = new MyQueue(4);
Person *p1 = new Person("小包", 2);
Person *p2 = new Person("小红", 33);
Person *p3 = new Person("小花", 34);
Person *p4 = new Person("老王", 50);
Person *p5 = new Person("老张", 50);
m->EnQueue(p1);
m->EnQueue(p2);
m->EnQueue(p3);
m->EnQueue(p4);
m->EnQueue(p5);
m->TraverselQueue();
return 0;

}



数据结构:

逻辑结构
1,集合
2,线性结构
3,树形结构
4,图形结构
物理结构:
就是把数据元素存储到计算机的存储器中,这里说的存储器主要是内存。
数据元素的存储形式有两种:顺序存储和链式存储。
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。就像是数组


关于算法的举例
等差数列求和1-100的和为5050
一般的代码:
int sum=0;
int n=100; //n个数的求和
for(int i=1;i<=n;i++){
   sum=sum+i;
}
运用算法的代码
int sum=0;
int n=100;
sum=(1+n)*n/2;//可以看出只运行一次就运算出结果,而不是循环100次。这是高斯算法


算法具有五个基本特征:1,输入 2,输出 3,有穷性 4,确定性 5,可行性
算法的要求:时间效率高,存储量低。
用O()来表示时间复杂度。
怎么来推断O()?
用常数1取代运行时所有的加法常数。
在修改后的运行次数函数中,只保留最高阶项。
如果最高阶项存在且不是1,则去除与这个项相乘的常数。O(2n^2),写成O(n^2)
例如:
int sum=0;
int n=100;
for(int i=1;i<=n;i++){
   sum=sum+i;
}


时间复杂度为O(n)
int sum=0;
int n=100;
for(int i=1;i<=n;i++){
   for(int j=1;j<=n;j++){
sum=sum+i;
   }
}
时间复杂度为O(n^2)
如果嵌套3个循环,那么时间复杂度为O(n^3)


int i=1;
int n=100;
while(i<n){
    i=i*2;
}
由于每乘2之后,都会距离循环结束更近一步,可以记做2^x=n;x就是次数,所以得到x=log(2)n,时间复杂为O(logn)




for(int i=0;i<n;i++){
    f(i);
}
void f(int x){
    cout << x <<endl;
}
函数f()的时间复杂度为O(1)
所以整体的复杂度是O(n)






二叉树:是指每个节点的度,也就是子节点都小于2的树是二叉树。
二叉树的遍历
前序排列,中序排列,后序排列是相对于根来判断的。
前序排列,根节点,左子节点,右子节点
中序排列:左子节点,根节点,右子节点
后序排列:左子节点,右子节点,根节点
计算节点和子节点的算法
比如该节点为n,左子节点下标为2n+1,右子节点的下标2n+2


c++中想要使用c的函数库需要#include "stdio.h"
#include  是预处理器编译指令
using namespace  是编译指令
using namespace std;   是为了cout cin endl等输出用的引入包
cout << "something"; <<符号是表示把字符串发送给cout,<<表明了信息流动的路径,cout是一个预定义对象,它能够显示输出。 它将一个字符串插入到输出流中。
<<代表了插入运算符,<<也是左移运算符,这是一种运算符重载。编译器通过上下文来确定运算符的含义。比如&是取地址符,也是按位与的运算符。*表示乘法,也代表指针。
endl:代表换行。它是在iostream中定义的,位于命名空间std中。
字符串引号中的换行用\n。


使用数学类:#include <cmath>

计算机内存的基本单元是位(bit),位可以看做是开关,开是1,关是0。
一个字节是8位,8位的内存能够存储256种组合。0-255或-128到127
16位就是65536中组合相当于256*256。
C++中的基本数据类型:
32位编译器                         64位编译器
bool: 1个字节
char: 1个字节
short(short int): 2个字节
int: 4个字节
unsigned int: 4个字节
long(long int): 4个字节                    8个字节
long long(long long int):8个字节
float: 4个字节
double: 8个字节
unsigned long: 4个字节                    8个字节
*p(任意指针): 4个字节


整形都有一种相对应的无符号整数,用unsigned表示,如 unsigned int,它没有负数,所以当不用负数的情况下可以看做是数据容量变大。
修改进制输出在输出前加上cout<<hex 8进制 ,cout<<oct 16进制


16进制常用来表示内存地址如:0x9C40


ASCII编码存储的都是整形,对应着文字等和整形的值
例如:
char c = 'A'
int i = c;
输出i的值为65
输出char(i)的值为A
那么也可以说char实际上是一个int


c++中在字符串中的转义字符
换行符 \n
水平制表符 \t
垂直制表符 \v
退格 \b
回车 \r
振铃 \a
反斜杠 \\
问号 \?
单引号 \'
双引号 \"


数组:
int arr1[4]={1,2,3,4};
int arr2[4];
int arr3[5]={1,2}//可以赋值其中几个元素,没有赋值的默认为0
得到数组长度的方法
int arr[4];
int len=sizeof(arr)/sizeof(int);
由于编译器的计数比较糟糕,所以数组元素个数自己写比较好。


初始化字符串的方式
char str[]="abcde";
string s="ABCD ";
s.size();//结果为5,空字符也计算长度

使用INT_MAX,INT_MIN,LONG_MAX,LONG_MIN等等可以输出类型的最大最小值。
可以这样初始化:
int a1=INT_MAX;
也可以用字面量:
int a2=5;
(Tips:如果不对函数内部定义的变量进行初始化,该变量的值将是不确定的,这意味着该变量的值将是它被创建之前,相应内存保存的值。)




关于
Person(string name,int age){
    this.name=name;
    this.age=age;   
}
java中可以用this.name,C++中也可以,说明java中使用的是引用。


public class Person{
   public int n;
   Person(int n){this.n=n;}
   Person(Person other){
      n=other.n;
   }
}
在java中没有问题,因为java传递的是引用,所以Person(Person other)并不会导致无限递归
在c++中会导致递归,因为它会再new出一个对象,在C++中是值传递。如果想解决这个问题,
那么修改成Person(const Person& other),改成常量引用参数就没有问题了。


在进行算数运算符的时候,如果有一个变量为float,那么结果是double


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值