用一个栈的结构体写lru置换算法C语言
时间: 2023-12-10 11:03:53 浏览: 110
下面是一个基于栈结构体的LRU置换算法的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
// 定义栈结构体
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void init(Stack *stack) {
stack->top = -1;
}
// 判断栈是否为空
int is_empty(Stack *stack) {
return stack->top == -1;
}
// 判断栈是否已满
int is_full(Stack *stack) {
return stack->top == MAX_SIZE - 1;
}
// 入栈操作
void push(Stack *stack, int value) {
if (is_full(stack)) {
printf("Stack Overflow\n");
return;
}
stack->data[++stack->top] = value;
}
// 出栈操作
int pop(Stack *stack) {
if (is_empty(stack)) {
printf("Stack Underflow\n");
exit(1);
}
return stack->data[stack->top--];
}
// 查找栈中是否存在某个元素
int find(Stack *stack, int value) {
int i;
for (i = 0; i <= stack->top; i++) {
if (stack->data[i] == value) {
return i;
}
}
return -1;
}
// LRU置换算法
void lru_replace(Stack *stack, int value) {
int index = find(stack, value);
if (index == -1) {
// 如果栈中不存在该元素,则入栈
push(stack, value);
if (stack->top >= MAX_SIZE) {
// 如果栈已经满了,则弹出栈底元素
pop(stack);
}
} else {
// 如果栈中存在该元素,则将该元素移到栈顶
int i;
for (i = index; i < stack->top; i++) {
stack->data[i] = stack->data[i + 1];
}
stack->data[stack->top] = value;
}
}
int main() {
Stack stack;
init(&stack);
// 测试用例
lru_replace(&stack, 1);
lru_replace(&stack, 2);
lru_replace(&stack, 3);
lru_replace(&stack, 4);
lru_replace(&stack, 5);
lru_replace(&stack, 6);
lru_replace(&stack, 7);
lru_replace(&stack, 8);
lru_replace(&stack, 9);
lru_replace(&stack, 10);
lru_replace(&stack, 1);
int i;
for (i = 0; i <= stack.top; i++) {
printf("%d ", stack.data[i]);
}
printf("\n");
return 0;
}
```
在上面的代码中,我们定义了一个`Stack`结构体来表示栈,其中`data`数组用来存储栈中的元素,`top`变量表示栈顶的位置。我们实现了栈的基本操作,包括初始化、入栈、出栈、判断栈是否为空和栈是否已满等。
在`lru_replace`函数中,我们首先调用`find`函数来查找栈中是否存在要置换的元素。如果栈中不存在该元素,则将它入栈,并判断栈是否已满,如果已经满了,则弹出栈底元素;如果栈中已经存在该元素,则将该元素移到栈顶。
最后,我们在`main`函数中进行测试,将一些元素入栈并进行LRU置换,然后输出栈中的元素。
阅读全文