14.由用户输入n个10以内的数,每当输入i(0<=i<=9),就把它插入到第i号队列中。最后把10个队列中非空队列,按队列号从小到大得顺序串接成一条链,并输出该链 的所有元素。
#include<iostream>
using namespace std;
class Node
{
public:
int data;
Node* link;
Node(int data)
{
this->data=data;
this->link=NULL;
}
};
class LinkQueue
{
private:
int size;
Node* front;
Node* rear;
public:
LinkQueue()
{
size=0;
front=rear=NULL;
}
~LinkQueue()
{
Clear();
}
void Clear()
{
while(front!=NULL)
{
rear=front;
front=front->link;
delete rear;
}
rear=NULL;
size=0;
}
bool EnQueue(int data)
{
if(rear==NULL)
{
front=rear=new Node(data);
}else
{
rear->link=new Node(data);
rear=rear->link;
}
size++;
return true;
}
int IsEmpty()
{
if(size==0)
{
return 1;
}else
{
return 0;
}
}
void show()
{
Node *p = front;
if(p == NULL){
cout << "空";
}
else
for(p;p!=rear->link;p = p->link)
{
cout << p->data;
}
}
void Link(LinkQueue& start)
{
if(rear==NULL)
{
front=start.front;
rear=start.rear;
size=start.size;
}
else
{
rear->link=start.front;
rear=start.rear;
size+=start.size;
}
}
};
int main()
{
LinkQueue a[10];
int i;
cin>>i;
while(i>=0&&i<=9)
{
a[i].EnQueue(i);
cin>>i;
}
for(int n=0;n<=9;n++)
{
cout<<"第"<<n<<"个队列:";
a[n].show();
cout<<endl;
}
for(int j=1;j<=9;j++)
{
if(!a[j].IsEmpty())
a[0].Link(a[j]);
}
cout<<"连接后的队列为:"<<endl;
a[0].show();
return 0;
}
15.环形队列(TAG)
#include <iostream>
using namespace std;
class CircleArray
{
private:
int maxSize; // 数组最大容量
int front; // 队列头部,指向第一个元素,初始值为0
int rear; // 队列尾部,指向最后一个元素的下一位(即空值),初始值为0
int tag; //区分满or空
int *arr; // 定义数组,模拟环形队列
public:
CircleArray(int maxSize)
{
this->maxSize = maxSize;
arr = (int *)new int[maxSize]; // 初始化数组长度
front = 0;
rear = 0;
tag = 0;
}
// 判断队列是否已满
bool isFull()
{
return rear == front && tag == 1;
}
// 判断队列是否为空
bool isEmpty()
{
return rear == front && tag == 0;
}
// 添加数据到队伍,rear后移一位(取模)
void addValue(int n)
{
if (isFull())
{
cout << "队列已满,无法添加数据" << endl;
}
else
{
arr[rear] = n;
rear = (rear + 1) % maxSize;
tag = 1;
}
}
// 获取队列的数据,front后移一位
int getValue()
{
if (isEmpty())
{
cout << "队列为空,无数据" << endl;
return -1;
}
else
{
int value = arr[front];
front = (front + 1) % maxSize;
tag=0;
return value;
}
}
// 显示队列的所有数据
void showValue()
{
if (isEmpty())
{
cout << "队列为空,没有数据" << endl;
}
else
{
for (int i = front; i < front + size(); i++)
{
cout << "arr[" << i % maxSize << "]=" << arr[i % maxSize];
}
}
}
// 求出当前队列有效数据的个数
int size()
{
if(isFull()) return maxSize;
return (maxSize+rear-front)%maxSize;
}
// 显示队列的头数据, 注意不是取出数据
int headValue()
{
if (isEmpty())
{
cout << "No data" << endl;
return -1;
}
return arr[front];
}
};
int main()
{
CircleArray arr(10);
for (int i = 0; i < 11; i++)
arr.addValue(i);
cout<<"队列长度="<<arr.size()<<endl;
arr.showValue();cout<<endl;
cout<<"弹出队首元素="<<arr.getValue()<<endl;
cout<<"队列长度="<<arr.size()<<endl;
arr.showValue();cout<<endl;
arr.addValue(999);
arr.showValue();
return 0;
}
17.Strcmp函数的实现
#include <iostream>
#include <cstring>
using namespace std;
int Strcmp(const string & s,const string & t)
{
int i=0;
while(i<=s.size() && i<=t.size())
if(s[i]==t[i]) i++;
else return s[i]<t[i]?(-1):(1);
return 0;
}
int main()
{
string str1;
string str2;
cin>>str1;
cin>>str2;
cout<<Strcmp(str1,str2)<<endl;
return 0;
}
18.查找字符串最后一次出现的位置(解决方法:反向KMP)
#include <cassert>
#include <iostream>
using namespace std;
/*
TODO:1.7-b. 计算字符串p的特征向量的算法,返回特征向量的数组。
*/
int* next(string P)
{
int m=P.size(); //字符串的长度
assert(m>0); //字符串>0?
int *N=new int[m]; //开辟一些空间存放特征数组
assert(N!=0); //确保开辟成功
N[m-1]=0; //最后一个字符的特征值为零
for(int j=m-2;j>=0;j--) //从倒数第二个字符开始计算特征值
{
int k=N[j+1];
while(k>0 && P[j]!=P[m-k-1])
k=N[m-k];
if(P[j]==P[m-k-1])
N[j]=k+1;
else
N[j]=0;
}
return N;
}
/*
/TODO:KMP模式匹配算法,返回子串最后一次出现的位置,若不存在,返回-1
参数说明:T为原始字符串
P为子串
N为字符串P的特征向量
返回值说明:通过KMP算法如果查找到子串,则返回子串第一次出现的位置,
否则没有查找到,返回-1
*/
int KMPStrMatching(string T, string P, int* N)
{
if(T.size()-P.size()<0)
return -1;
int i=T.size()-1;
int j=P.size()-1;
while(i>=0&&j>=0)
{
if(P[j]==T[i])
{
if(j==0) break;
j--;i--;
}
else if(j!=P.size()-1)
j=P.size()-N[j+1]-1;
else i--;
}
if(j==0 && i>=0)
return i+1;
else return -1;
}
int main()
{
string substr; //要查找的字符串
string str; //原始字符串
getline(cin, substr);
getline(cin, str);
int* N;
N = next(substr);
for (int i = 0; i < substr.length(); i++)
cout << N[i] << " ";
cout << endl;
cout << KMPStrMatching(str, substr, N) << endl;
return 0;
}
还是太久没敲代码了啊
1 条评论
什么时候更新第三次