自调整表简介:自调整表的插入在前端进行。相比普通的栈和链表,自调整表有一个特殊的功能:find操作,即当一个元素被find方法访问时,它就会被移到自调整表的最前端位置,而不改变其余元素的相对位置。
细读要求,这实际上相当于一个正常的栈,多了一个方法,而这个新方法的功能相当于删除后再入栈。对于链表实现也是如此,find方法相当于记住需要删除的结点,之后把该结点利用头插法加到本list的头部。
以下分别是利用栈和链表来实现自调整表的代码。
typedef struct
{
int Data[MaxSize];
int top;
}selflistQUE;
class test006
{
public:
void initi(selflistQUE& SE)
{
SE.top = -1;
}
bool pushSE(selflistQUE& SE, int x)
{
if (SE.top == MaxSize - 1)
{
cout << "栈已满" << endl;
return false;
}
SE.Data[++SE.top] = x;
return true;
}
bool popSE(selflistQUE& SE,int&x)
{
if (SE.top == -1)
{
cout << "栈为空" << endl;
return false;
}
x = SE.Data[SE.top--];
return true;
}
bool emptySE(selflistQUE SE)
{
if (SE.top == -1)
{
return true;
}
return false;
}
void findSE(selflistQUE& SE, int x)
{
int i = SE.top;
for (;i > 0;i--)
{
if (SE.Data[i] == x)
{
break;
}
}
int temp = SE.Data[i];
while (i < SE.top)
{
SE.Data[i] = SE.Data[i + 1];
i += 1;
}
SE.Data[SE.top] = temp;
}
};
//selflistLIST
class Node
{
public:
int value;
Node* next;
Node(int x) :value(x),next(nullptr) {};
};
class test007
{
public:
int size;
Node* head;
test007()
{
this->size = 0;
}
void insertLIST(int val)
{
Node* s = new Node(val);
if (!head)
{
head = s;
}
else
{
Node* temp = head;
head = s;
s->next = temp;
}
this->size += 1;
}
void deleteLIST(int val)
{
Node* s = head;
Node* temp = s;
while (s->value!=val)
{
temp = s;
s = s->next;
}
temp->next = s->next;
this->size -= 1;
}
void findLIST(int val)
{
Node* s = head;
Node* temp = s;
while (s->value != val)
{
temp = s;
s = s->next;
}
temp->next = s->next;
s->next = head;
head = s;
}
void travelLIST()
{
Node* temp = head;
for(int i=0;i<this->size;i++)
{
cout << temp->value;
Node*s = temp->next;
temp = s;
}
}
};