理论来源以及思路来源,请点击这里,这是链接
图片我是从文章链接网址抄的
虽然说是堆栈存储,但不是我们一般想的堆栈,有点像堆栈与队列的结合,他要求的是在栈顶插入,栈底或中间取出,因此我们用数组模拟。具体详情请看LRU原理。
#include <iostream>
using namespace std;
//查找函数,判断元素val有没有在堆栈stack中
int Find( int *stack , int val , int usedSpace ){
//usedSpace为堆栈已经使用的空间,因此循环从0到usedSpace-1
for( int i = 0 ; i < usedSpace ; i++ ){
if( val == stack[i] ){
return i;
}
}
return -1; //没有找到即没有在堆栈中返回-1
}
int main()
{
int stack[100]; //栈空间为100
int visited[100]; //任务队列空间为100
int usedSpace = 0; //栈中已经使用空间
int stackSpace = 0; //分配的栈大小
int n; //队列元素个数
cout << "请输入分配栈的大小:";
cin >> stackSpace;
cout << "\n\n请输入队列元素个数:";
cin >> n;
cout << "\n\n请以依次输入队列元素:\n";
for( int i = 0 ; i < n ; i++ ){ //输入任务队列元素
cin >> visited[i];
}
for( int i = 0 ; i < n ; i++ ){
int index = Find( stack , visited[i] , usedSpace); //判读元素visited[i]是否在堆栈中
//元素没有在堆栈中
if( index == -1 ){
//栈中有剩余空间,直接将元素放在栈顶
if( usedSpace < stackSpace ){
stack[ usedSpace ] = visited[i];
usedSpace++;
}else{ //栈中没有剩余元素,需要将栈顶元素置换出来
int j;
for( j = 0 ; j < stackSpace - 1 ; j++ ){ //每个元素往前移动,覆盖栈底元素
stack[j] = stack[j + 1];
}
stack[j] = visited[i]; //栈顶元素赋予新值
}
}else{ //元素在堆栈中,要把它从栈中拿到栈顶
int j;
//从存在位置往前移,覆盖已存在元素
for( j = index ; j < usedSpace - 1 ; j++ ){
stack[j] = stack[j + 1];
}
stack[j] = visited[i];
}
}
cout << "\n\n栈中元素从栈底到栈顶依次是:\n";
for( int i = 0 ; i < usedSpace ; i++ ){
cout << stack[i] <<" ";
}
return 0;
}