线性表 P66
3.算法设计
(1)已知顺序表L中的元素递增有序排列,设计算法将元素x插入到表L中并保持表L仍递增有序。
#include <iostream>
const int max_length=100;
using namespace std;
template <typename T>
class SeqList{
public:
SeqList();
SeqList(T a[],int l);
void XInsert(T a);
private:
T data[max_length];
int length;
};
template<typename T>
SeqList<T>::SeqList(){
length=0;
}
template<typename T>
SeqList<T>::SeqList(T a[],int l){
if(l>max_length) throw "overflow!!!";
for(int i=0;i<l;i++)
data[i]=a[i];
length=l;
}
template<typename T>
void SeqList<T>::XInsert(T a){
if(length==max_length) throw "overflow!!!";
int t=-1;
for(int i=0;i<length;i++)
if(data[i]>=a) {t=i;break;}
if(t==-1) t=length;
for(int i=length;i>=t;i--)
data[i]=data[i-1];
data[t]=a;
length+=1;
cout<<"------------------"<<endl;
for(int i=0;i<length;i++)
cout<<data[i]<<endl;
}
int main()
{
int x[5]={1,2,4,5,7};
SeqList<int> a(x,5);
a.XInsert(0);
a.XInsert(3);
a.XInsert(8);
a.XInsert(6);
}
(2)在顺序表中删除所有元素值为x的元素,要求空间复杂度为O(1)。
#include <iostream>
const int max_length=100;
using namespace std;
template <typename T>
class SeqList{
public:
SeqList();
SeqList(T a[],int l);
void DeleteAll(T x);
private:
T data[max_length];
int length;
};
template<typename T>
SeqList<T>::SeqList(){
length=0;
}
template<typename T>
SeqList<T>::SeqList(T a[],int l){
if(l>max_length) throw "overflow!!!";
for(int i=0;i<l;i++)
data[i]=a[i];
length=l;
}
template<typename T>
void SeqList<T>::DeleteAll(T x){
for(int i=0;i<length;i++){
if(data[i]!=x) continue;
for(int j=i;j<length-1;j++)
data[j]=data[j+1];
length--;
i--;
}
if(length==0) throw "overflow!!!";
for(int i=0;i<length;i++)
cout<<data[i]<<endl;
}
int main()
{
int x[5]={1,1,3,2,2};
SeqList<int> a(x,5);
a.DeleteAll(1);
a.DeleteAll(2);
a.DeleteAll(3);
}
(3)分别以顺序表和单链表作存储结构,各编写一个实现线性表就地逆置的算法
1.顺序表
#include <iostream>
const int max_length=100;
using namespace std;
template <typename T>
class SeqList{
public:
SeqList();
SeqList(T a[],int l);
void ReverseList();
private:
T data[max_length];
int length;
};
template<typename T>
SeqList<T>::SeqList(){
length=0;
}
template<typename T>
SeqList<T>::SeqList(T a[],int l){
if(l>max_length) throw "overflow!!!";
for(int i=0;i<l;i++)
data[i]=a[i];
length=l;
}
template<typename T>
void SeqList<T>::ReverseList(){
T t;
for(int i=0;i<length/2;i++){
t=data[i];
data[i]=data[length-i-1];
data[length-i-1]=t;
}
for(int i=0;i<length;i++)
cout<<data[i]<<endl;
}
int main()
{
int x[6]={1,2,3,4,5,6};
SeqList<int> a(x,6);
a.ReverseList();
}
2.单链表(呕心沥血,太难了)
#include <iostream>
using namespace std;
template <typename T>
class Node{
public:
T data;
Node<T> *next;
};
template <typename T>
class LinkList{
public:
LinkList();
LinkList(T a[],int l,int flag);
void ReverseList();
void PrintList();
private:
Node<T> *first;
};
template<typename T>
LinkList<T>::LinkList(){
first=new Node<T>;
first->next=nullptr;
}
template<typename T>
LinkList<T>::LinkList(T a[],int l,int flag){
if(flag==0){
first=new Node<T>;
first->next=nullptr;
for(int i=0;i<l;i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
p->next=first->next;
first->next=p;
}
}
else {
first=new Node<T>;
Node<T> *r=first,*p=nullptr;
for(int i=0;i<l;i++)
{
p=new Node<T>;
p->data=a[i];
r->next=p;
r=p;
}
r->next=nullptr;
}
}
template<typename T>
void LinkList<T>::PrintList(){
Node<T> *p=first->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template<typename T>
void LinkList<T>::ReverseList(){
Node<T> *newF=first->next;
first->next=nullptr;
while(newF){
Node<T> *p=new Node<T>;
Node<T> *q=newF;
p->data=newF->data;
p->next=first->next;
first->next=p;
newF=newF->next;
delete q;
}
}
int main()
{
int x[5]={1,2,3,4,5};
LinkList<int> a(x,5,1);
a.PrintList();
a.ReverseList();
a.PrintList();
}
(4)设计算法判断非空单链表是否递增有序
#include <iostream>
using namespace std;
template <typename T>
class Node{
public:
T data;
Node<T> *next;
};
template <typename T>
class LinkList{
public:
LinkList();
LinkList(T a[],int l,int flag);
bool isAscOrder();
private:
Node<T> *first;
};
template<typename T>
LinkList<T>::LinkList(){
first=new Node<T>;
first->next=nullptr;
}
template<typename T>
LinkList<T>::LinkList(T a[],int l,int flag){
if(flag==0){
first=new Node<T>;
first->next=nullptr;
for(int i=0;i<l;i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
p->next=first->next;
first->next=p;
}
}
else {
first=new Node<T>;
Node<T> *r=first,*p=nullptr;
for(int i=0;i<l;i++)
{
p=new Node<T>;
p->data=a[i];
r->next=p;
r=p;
}
r->next=nullptr;
}
}
template<typename T>
bool LinkList<T>::isAscOrder(){
Node<T> *p=first->next;
while(p->next){
if(p->data>p->next->data) return false;
p=p->next;
}
return true;
}
int main()
{
int x[6]={7,2,3,4,5,6};
LinkList<int> a(x,6,1);
cout<<a.isAscOrder();
}
(5)给定一个带头结点的单链表,设计算法按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class LinkList
{
public:
LinkList();
LinkList(T a[],int l,int flag);
void PrintAscOrder();
void Print();
private:
Node<T> *first;
};
template<typename T>
LinkList<T>::LinkList()
{
first=new Node<T>;
first->next=nullptr;
}
template<typename T>
LinkList<T>::LinkList(T a[],int l,int flag)
{
if(flag==0)
{
first=new Node<T>;
first->next=nullptr;
for(int i=0; i<l; i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
p->next=first->next;
first->next=p;
}
}
else
{
first=new Node<T>;
Node<T> *r=first,*p=nullptr;
for(int i=0; i<l; i++)
{
p=new Node<T>;
p->data=a[i];
r->next=p;
r=p;
}
r->next=nullptr;
}
}
template <typename T>
void LinkList<T>::Print()
{
Node<T> *p=first->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template<typename T>
void LinkList<T>::PrintAscOrder()
{
while(first->next)
{
Node<T> *p=first;
Node<T> *q=first->next;
Node<T> *s=first;
while(p->next)
{
if(p->next->data<q->data) {q=p->next;s=p;}
p=p->next;
}
cout<<q->data<<" ";
s->next=q->next;
delete q;
p=first->next;
}
cout<<endl;
}
int main()
{
int x[5]= {5,4,3,2,7};
LinkList<int> a(x,5,1);
a.Print();
a.PrintAscOrder();
a.Print();
}
(6)设单链表以非递归有序排列,设计算法实现在单链表中删除值相同的多余结点
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class LinkList
{
public:
LinkList();
LinkList(T a[],int l,int flag);
void DeleteSame();
void Print();
private:
Node<T> *first;
};
template<typename T>
LinkList<T>::LinkList()
{
first=new Node<T>;
first->next=nullptr;
}
template<typename T>
LinkList<T>::LinkList(T a[],int l,int flag)
{
if(flag==0)
{
first=new Node<T>;
first->next=nullptr;
for(int i=0; i<l; i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
p->next=first->next;
first->next=p;
}
}
else
{
first=new Node<T>;
Node<T> *r=first,*p=nullptr;
for(int i=0; i<l; i++)
{
p=new Node<T>;
p->data=a[i];
r->next=p;
r=p;
}
r->next=nullptr;
}
}
template <typename T>
void LinkList<T>::Print()
{
Node<T> *p=first->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template<typename T>
void LinkList<T>::DeleteSame()
{
Node<T> *p=first->next;
while(p){
if(p->next&&p->data==p->next->data) p->next=p->next->next;
else p=p->next;
}
}
int main()
{
int x[13]= {1,3,3,3,4,4,5,6,7,8,8,8,8};
LinkList<int> a(x,13,1);
a.Print();
a.DeleteSame();
a.Print();
}
(7)已知单链表中各结点的元素值为整型且递增有序,设计算法删除链表中大于mink且小于maxk的所有元素,并释放被删结点的存储空间。
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class LinkList
{
public:
LinkList();
LinkList(T a[],int l,int flag);
void DeleteNX(int mink,int maxk);
void Print();
private:
Node<T> *first;
};
template<typename T>
LinkList<T>::LinkList()
{
first=new Node<T>;
first->next=nullptr;
}
template<typename T>
LinkList<T>::LinkList(T a[],int l,int flag)
{
if(flag==0)
{
first=new Node<T>;
first->next=nullptr;
for(int i=0; i<l; i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
p->next=first->next;
first->next=p;
}
}
else
{
first=new Node<T>;
Node<T> *r=first,*p=nullptr;
for(int i=0; i<l; i++)
{
p=new Node<T>;
p->data=a[i];
r->next=p;
r=p;
}
r->next=nullptr;
}
}
template <typename T>
void LinkList<T>::Print()
{
Node<T> *p=first->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template<typename T>
void LinkList<T>::DeleteNX(int mink,int maxk)
{
Node<T> *p=first;
while(p->next){
if(p->next->data>mink&&p->next->data<maxk){
Node<T> *q=p->next;
p->next=q->next;
delete q;
}
else p=p->next;
}
}
int main()
{
int x[13]= {1,3,3,3,4,4,5,6,7,8,8,8,8};
LinkList<int> a(x,13,1);
a.Print();
a.DeleteNX(0,7);
a.Print();
}
(8)有两个整数序列A={a1,a2,…,am}和B={b1,b2,…,bn}已经存入两个单链表中,设计算法判断序列B是否是序列A的子序列。
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class LinkList
{
public:
LinkList();
LinkList(T a[],int l,int flag);
bool isCorrect(LinkList<T> ex);
private:
Node<T> *first;
};
template<typename T>
LinkList<T>::LinkList()
{
first=new Node<T>;
first->next=nullptr;
}
template<typename T>
LinkList<T>::LinkList(T a[],int l,int flag)
{
if(flag==0)
{
first=new Node<T>;
first->next=nullptr;
for(int i=0; i<l; i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
p->next=first->next;
first->next=p;
}
}
else
{
first=new Node<T>;
Node<T> *r=first,*p=nullptr;
for(int i=0; i<l; i++)
{
p=new Node<T>;
p->data=a[i];
r->next=p;
r=p;
}
r->next=nullptr;
}
}
template<typename T>
bool LinkList<T>::isCorrect(LinkList<T> ex){
Node<T> *p=first->next;
Node<T> *q=ex.first->next;
while(q){
if(q->data==p->data) {q=q->next;p=p->next;}
else {p=first->next;q=q->next;}
if(!p) return true;
}
return false;
}
int main()
{
int x[13]= {1,3,3,3,4,4,5,6,7,8,8,8,4};
int y[4]={3,4,4,5};
LinkList<int> a(x,13,1);
LinkList<int> b(y,4,1);
cout<<b.isCorrect(a);
}
(9)假设在长度大于1的循环链表中,即无头结点也无头指针,s为指向链表中某个结点的指针,试编写算法删除结点s的前趋结点。
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class CirLinkList
{
public:
CirLinkList();
CirLinkList(T a[],int l);
void DeletePre(T x);
private:
Node<T> *door;
int length;
};
template<typename T>
CirLinkList<T>::CirLinkList()
{
door=new Node<T>;
door=nullptr;
door->next=door;
length=0;
}
template<typename T>
CirLinkList<T>::CirLinkList(T a[],int l)
{
length=l;
door=new Node<T>;
Node<T> *p=door;
p->data=a[0];
for(int i=1;i<l;i++){
Node<T> *t=new Node<T>;
t->data=a[i];
p->next=t;
p=p->next;
}
p->next=door;
}
template<typename T>
void CirLinkList<T>::DeletePre(T x){
Node<T> *p=door;
Node<T> *t=door;
int flag=1;
while(p->data!=x){
p=p->next;
if(p==door) {cout<<"没有这个结点"<<endl;flag=0;break;}
}
if(flag){
for(int i=0;i<length-1;i++)
{t=p;p=p->next;}
t->next=p->next;
cout<<"已删除结点:"<<p->data;
if(p==door) door=t;
delete p;
}
cout<<endl;
Node<T> *s=door;
do{
cout<<s->data<<" ";
s=s->next;
}while(s!=door);
}
int main()
{
int a[5]={1,2,3,4,5};
CirLinkList<int> x(a,5);
x.DeletePre(3);
}
(10)判断带头结点的双循环链表是否对称。
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next,*prior;
};
template <typename T>
class DCirLinkList
{
public:
DCirLinkList();
DCirLinkList(T a[],int l);
bool isSymmetrical();
private:
Node<T> *first;
int length;
};
template<typename T>
DCirLinkList<T>::DCirLinkList()
{
first=new Node<T>;
first->next=first;
first->prior=first;
length=0;
}
template<typename T>
DCirLinkList<T>::DCirLinkList(T a[],int l)
{
first=new Node<T>;
Node<T> *rear=first;
first->next=first;
first->prior=first;
for(int i=0; i<l; i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
rear->next=p;
p->prior=rear;
rear=p;
}
rear->next=first;
first->prior=rear;
length=l;
}
template<typename T>
bool DCirLinkList<T>::isSymmetrical()
{
Node<T> *p=first->next;
Node<T> *q=first->prior;
do{
if(p->data!=q->data) return false;
p=p->next;
q=q->prior;
}while(p!=q);
return true;
}
int main()
{
int a[6]= {1,2,3,4,2,1};
DCirLinkList<int> x(a,6);
cout<<x.isSymmetrical()<<endl;
}
(11)设计算法实现在双链表中第i个结点的后面插入一个值为x的结点。
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next,*prior;
};
template <typename T>
class DLinkList
{
public:
DLinkList();
DLinkList(T a[],int l);
void Insert(int i,T x);
private:
Node<T> *first;
int length;
};
template<typename T>
DLinkList<T>::DLinkList()
{
first=new Node<T>;
length=0;
}
template<typename T>
DLinkList<T>::DLinkList(T a[],int l)
{
length=l;
first=new Node<T>;
Node<T> *rear=first;
for(int i=0;i<l;i++){
Node<T> *p=new Node<T>;
p->data=a[i];
p->prior=rear;
rear->next=p;
rear=p;
}
}
template<typename T>
void DLinkList<T>::Insert(int i,T x){
if(i>length||i<0) throw "place error!!!";
if(length==0){
Node<T> *p=new Node<T>;
p->data=x;
first->next=p;
p->prior=first;
length++;
}
else{
Node<T> *p=first;
int count=0;
while(count++<i)
p=p->next;
Node<T> *q=new Node<T>;
q->data=x;
p->next->prior=q;
q->next=p->next;
p->next=q;
q->prior=p;
length++;
}
Node<T> *t=first->next;
for(int i=0;i<length;i++)
{
cout<<t->prior->data<<" "<<t->data<<" "<<t->next->data<<endl;
t=t->next;
}
}
int main()
{
int a[6]= {1,2,3,4,5,6};
DLinkList<int> x(a,6);
DLinkList<int> y;
x.Insert(0,3);
cout<<"---------------------"<<endl;
y.Insert(0,2);
cout<<"---------------------"<<endl;
y.Insert(0,3);
}
(12)假设用不带头结点的单链表表示八进制数。要求写一个函数Add,该函数有两个参数A和B,分别指向表示八进制数的单链表,执行函数调用Add(A,B)后,得到表示八进制数A加八进制数B所得结果的单链表。
(1)带头结点的内置函数
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next,*prior;
};
template <typename T>
class DLinkList
{
public:
DLinkList();
DLinkList(T a[],int l);
DLinkList<T> Add(DLinkList x);
void Print();
private:
Node<T> *first,*rear;
int length;
};
template<typename T>
void DLinkList<T>::Print(){
Node<T> *p=first->next;
while(p){
cout<<p->data;
p=p->next;
}
}
template<typename T>
DLinkList<T>::DLinkList()
{
first=new Node<T>;
first->next=nullptr;
length=0;
}
template<typename T>
DLinkList<T>::DLinkList(T a[],int l)
{
length=l;
first=new Node<T>;
rear=first;
for(int i=0;i<l;i++){
Node<T> *p=new Node<T>;
p->data=a[i];
p->prior=rear;
rear->next=p;
rear=p;
}
}
template<typename T>
DLinkList<T> DLinkList<T>::Add(DLinkList<T> x){
Node<T> *p=x.rear;
Node<T> *q=rear;
DLinkList<T> f;
int flag=0;
if(x.length==length){
while(p!=x.first){
Node<T> *t=new Node<T>;
if(p->data+q->data+flag>7){
t->data=p->data+q->data+flag-7;
flag=1;
}
else{
t->data=p->data+q->data+flag;
flag=0;
}
t->next=f.first->next;
f.first->next=t;
p=p->prior;
q=q->prior;
}
}
else if(x.length<length){
while(p!=x.first){
Node<T> *t=new Node<T>;
if(p->data+q->data+flag>7){
t->data=p->data+q->data+flag-7;
flag=1;
}
else{
t->data=p->data+q->data+flag;
flag=0;
}
t->next=f.first->next;
f.first->next=t;
p=p->prior;
q=q->prior;
}
while(q!=first){
Node<T> *t=new Node<T>;
if(q->data+flag>7){
t->data=q->data+flag-7;
flag=1;
}
else{
t->data=q->data+flag;
flag=0;
}
t->next=f.first->next;
f.first->next=t;
q=q->prior;
}
}
else{
while(q!=first){
Node<T> *t=new Node<T>;
if(p->data+q->data+flag>7){
t->data=p->data+q->data+flag-7;
flag=1;
}
else{
t->data=p->data+q->data+flag;
flag=0;
}
t->next=f.first->next;
f.first->next=t;
p=p->prior;
q=q->prior;
}
while(p!=x.first){
Node<T> *t=new Node<T>;
if(p->data+flag>7){
t->data=p->data+flag-7;
flag=1;
}
else{
t->data=p->data+flag;
flag=0;
}
t->next=f.first->next;
f.first->next=t;
p=p->prior;
}
}
return f;
}
int main()
{
int x[5]= {1,7,1,4,7};
int y[3]={7,2,2};
DLinkList<int> a(x,5);
DLinkList<int> b(y,3);
DLinkList<int> c=a.Add(b);
c.Print();
}
(2)不带头结点的函数调用
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next,*prior;
};
template <typename T>
class DLinkList
{
public:
DLinkList();
DLinkList(T a[],int l);
void Print();
Node<T> *first,*rear;
int length;
};
template<typename T>
void DLinkList<T>::Print(){
Node<T> *p=first;
while(p!=rear){
cout<<p->data;
p=p->next;
}
}
template<typename T>
DLinkList<T>::DLinkList()
{
first=new Node<T>;
rear=first;
length=0;
rear->next=nullptr;
first->prior=nullptr;
}
template<typename T>
DLinkList<T>::DLinkList(T a[],int l)
{
length=l;
first=new Node<T>;
Node<T> *p=new Node<T>;
p->data=a[0];
first=p;
rear=first;
for(int i=1;i<l;i++){
Node<T> *p=new Node<T>;
p->data=a[i];
p->prior=rear;
rear->next=p;
rear=p;
}
rear->next=nullptr;
first->prior=nullptr;
}
template<typename T>
DLinkList<T> Add(DLinkList<T> y,DLinkList<T> x){
Node<T> *p=x.rear;
Node<T> *q=y.rear;
DLinkList<T> f;
int flag=0;
if(x.length==y.length){
while(p){
Node<T> *t=new Node<T>;
if(p->data+q->data+flag>7){
t->data=p->data+q->data+flag-7;
flag=1;
}
else{
t->data=p->data+q->data+flag;
flag=0;
}
t->next=f.first;
f.first=t;
p=p->prior;
q=q->prior;
}
}
else if(x.length<y.length){
while(p){
Node<T> *t=new Node<T>;
if(p->data+q->data+flag>7){
t->data=p->data+q->data+flag-7;
flag=1;
}
else{
t->data=p->data+q->data+flag;
flag=0;
}
t->next=f.first;
f.first=t;
p=p->prior;
q=q->prior;
}
while(q){
Node<T> *t=new Node<T>;
if(q->data+flag>7){
t->data=q->data+flag-7;
flag=1;
}
else{
t->data=q->data+flag;
flag=0;
}
t->next=f.first;
f.first=t;
q=q->prior;
}
}
else{
while(q){
Node<T> *t=new Node<T>;
if(p->data+q->data+flag>7){
t->data=p->data+q->data+flag-7;
flag=1;
}
else{
t->data=p->data+q->data+flag;
flag=0;
}
t->next=f.first;
f.first=t;
p=p->prior;
q=q->prior;
}
while(p){
Node<T> *t=new Node<T>;
if(p->data+flag>7){
t->data=p->data+flag-7;
flag=1;
}
else{
t->data=p->data+flag;
flag=0;
}
t->next=f.first;
f.first=t;
p=p->prior;
}
}
return f;
}
int main()
{
int x[4]= {1,2,3,7};
int y[3]={2,2,4};
DLinkList<int> a(x,4);
DLinkList<int> b(y,3);
DLinkList<int> c=Add(a,b);
c.Print();
}
栈和队列 P96
3.算法设计
(1)假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。设计入队和出队算法。
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class CirLinkQueue
{
public:
CirLinkQueue();
CirLinkQueue(T a[],int l);
void Print();
void EnQueue(T x);
void DeQueue();
Node<T> *door,*rear;
int length;
};
template<typename T>
void CirLinkQueue<T>::Print()
{
if(length==0) throw "overflow!!!";
Node<T> *s=door;
do
{
cout<<s->data<<" ";
s=s->next;
}
while(s!=door);
cout<<endl;
}
template<typename T>
CirLinkQueue<T>::CirLinkQueue()
{
length=0;
}
template<typename T>
CirLinkQueue<T>::CirLinkQueue(T a[],int l)
{
door=new Node<T>;
rear=door;
rear->next=door;
Node<T> *p=new Node<T>;
p->data=a[0];
door->data=a[0];
for(int i=1; i<l; i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
rear->next=p;
p->next=door;
rear=p;
}
length=l;
}
template<typename T>
void CirLinkQueue<T>::EnQueue(T x){
Node<T> *p=new Node<T>;
p->data=x;
if(length==0){
door=new Node<T>;
rear=door=p;
rear->next=door;
door->next=rear;
}
else{
rear->next=p;
rear=p;
p->next=door;}
length++;
Print();
}
template<typename T>
void CirLinkQueue<T>::DeQueue(){
Node<T> *p=door;
rear->next=door->next;
door=door->next;
delete p;
length--;
Print();
}
int main()
{
int x[5]= {1,2,3,4,5};
CirLinkQueue<int> a(x,5);
a.EnQueue(6);
a.EnQueue(7);
a.DeQueue();
a.DeQueue();
}
(2)设顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n,a2n-1,…,a1,要求通过一个循环队列重新排列栈中元素,使得从栈顶到栈底的元素依次为a2n,a2n-2,…,a2,a2n-1,a2n-3,…,a1,设计算法实现,空闲和时间复杂度均为O(n)。
#include <iostream>
using namespace std;
const int Size=100;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class SeqStack
{
public:
SeqStack(T a[],int l);
T Pop();
void Push(T x);
void Output();
private:
T data[Size];
int top;
};
template<typename T>
SeqStack<T>::SeqStack(T a[],int l){
top=-1;
if(l>Size||l<0) throw "overflow!!!";
for(int i=0;i<l;i++)
data[++top]=a[i];
}
template<typename T>
T SeqStack<T>::Pop(){
if(top==-1) throw "overflow!!!";
return data[top--];
}
template<typename T>
void SeqStack<T>::Push(T x){
if(top==Size) throw "overflow!!!";
data[++top]=x;
}
template<typename T>
void SeqStack<T>::Output(){
if(top==-1) throw "overflow!!!";
for(int i=top;i>=0;i--)
cout<<data[i]<<" ";
cout<<endl;
}
template <typename T>
class CirLinkQueue
{
public:
CirLinkQueue();
CirLinkQueue(T a[],int l);
void Print();
void EnQueue(T x);
T DeQueue();
Node<T> *door,*rear;
int length;
};
template<typename T>
void CirLinkQueue<T>::Print()
{
if(length==0) throw "overflow!!!";
Node<T> *s=door;
do
{
cout<<s->data<<" ";
s=s->next;
}
while(s!=door);
cout<<endl;
}
template<typename T>
CirLinkQueue<T>::CirLinkQueue()
{
length=0;
}
template<typename T>
CirLinkQueue<T>::CirLinkQueue(T a[],int l)
{
door=new Node<T>;
rear=door;
rear->next=door;
Node<T> *p=new Node<T>;
p->data=a[0];
door->data=a[0];
for(int i=1; i<l; i++)
{
Node<T> *p=new Node<T>;
p->data=a[i];
rear->next=p;
p->next=door;
rear=p;
}
length=l;
}
template<typename T>
void CirLinkQueue<T>::EnQueue(T x){
Node<T> *p=new Node<T>;
p->data=x;
if(length==0){
door=new Node<T>;
rear=door=p;
rear->next=door;
door->next=rear;
}
else{
rear->next=p;
rear=p;
p->next=door;}
length++;
}
template<typename T>
T CirLinkQueue<T>::DeQueue(){
Node<T> *p=door;
T x=p->data;
rear->next=door->next;
door=door->next;
delete p;
length--;
return x;
}
int main()
{
int x[8]= {1,2,3,4,5,6,7,8};
SeqStack<int> S(x,8);
S.Output();
CirLinkQueue<int> b;
for(int i=0;i<8;i++)
b.EnQueue(S.Pop());
for(int i=0;i<8;i++)
{if(i%2==0)
b.EnQueue(b.DeQueue());
else
S.Push(b.DeQueue());
}
for(int i=0;i<4;i++)
b.EnQueue(S.Pop());
for(int i=0;i<4;i++)
S.Push(b.DeQueue());
for(int i=0;i<4;i++)
b.EnQueue(S.Pop());
for(int i=0;i<8;i++)
S.Push(b.DeQueue());
S.Output();
}
(3)设计算法,把十进制整数转换为二至九进制之间的任一进制输出。
#include <iostream>
using namespace std;
const int Size=100;
template <typename T>
class Node
{
public:
T data;
Node<T> *next;
};
template <typename T>
class SeqStack
{
public:
SeqStack();
void Push(T x);
void Output();
private:
T data[Size];
int top;
};
template<typename T>
SeqStack<T>::SeqStack(){top=-1;}
template<typename T>
void SeqStack<T>::Push(T x){
if(top==Size) throw "overflow!!!";
data[++top]=x;
}
template<typename T>
void SeqStack<T>::Output(){
if(top==-1) throw "overflow!!!";
for(int i=top;i>=0;i--)
cout<<data[i];
cout<<endl;
}
int main()
{
SeqStack<int> a;
int n;
cin>>n;
int jj;
cin>>jj;
while(n!=0){
a.Push(n%jj);
n=n/jj;
}
a.Output();
}