使用操作系统中内存管理知识解析该算法。
代码解析:
全局变量:
stack//栈
visit_pages//访问轨迹
函数:
print_stack()//打印栈内情况
change_stack()//移动栈内元素
主函数:
套用一个双重for循环。
外层for:遍历访问轨迹visit_pages。
内层for:遍历栈stack。
内层for中含有一个if,和一个if,else if。
其中,if判断栈元素stack[j]是否为NULL,如果为NULL则直接将visit_pages[i]入栈到stack[j]。
另外,if,else if中,if判断栈stack[j]是否与visit_pages[i]相同,若相同,则从stack[j]之后往前覆盖,最终将visit_pages[i]赋值给stack[4]。else if判断栈内没与visit_pages[i]相同的元素,则从第stack[0]之后栈内元素往前覆盖, 最终visit_pages[i]赋值给stack[4]。
内存根据访问轨迹:3 5 0 5 1 0 8 2 5 1 3。
代码:
#include #include #include // 全局变量
char stack[5] ={0}; //栈
char visit_pages[11] = {'3', '5', '0', '5', '1', '0', '8', '2', '5', '1', '3'}; //访问轨迹
// 打印栈元素
void print_stack()
{
int m;
// 打印栈元素
for (m=0; m<5; m++) {
if (stack[m] == NULL) {
printf(" N");
} else {
printf(" %c", stack[m]);
}
}
printf("\n\n");
}
//移动栈值
void change_stack(int index, int i)
{
int temp, k;
//将栈底元素保存后,依次往前覆盖
temp = stack[index];
for (k=index; k<5; k++) { //相等下标值之后,往前覆盖
if (index != 0) {//只有当栈不满时,可直接跳出循环
if (stack[k+1] == NULL) {
break;
}
}
if (k+1 < 5) {
stack[k] = stack[k+1];
}
}
// 两种不同情况使用不同赋值
if (index != 0) {
if (k == 5) {
k = 4;
}
stack[k] = temp; //冒泡到顶部
stack[k] = visit_pages[i]; //替换顶部值
} else {
stack[4] = temp; //冒泡到顶部
stack[4] = visit_pages[i]; //替换顶部值
}
}
int main()
{
int i, j, k;
int index; //下标
int temp; //值中间量
//栈赋值
for (i=0; i<5; i++) {
stack[i] = NULL;
}
printf("栈底->栈顶: \n");
print_stack(); //初始栈打印
for (i=0; i%c:\n", visit_pages[i]);
print_stack();
}
return 0;
}
结果: