栈和队列的结构
先实现节点
struct Node{
int value; //数据
struct Node* next;
};
栈
栈是先进后出
比如我压入 1 2 3 4 5
弹出来的顺序就是 5 4 3 2 1
所以只需要记录栈顶元素就可以了,因为只能在一边操作...
struct Stack{
struct Node* top;
};
队列
队列是先进先出
我放入1 2 3 4 5
走出来就是 1 2 3 4 5
队列像是一条管道,可以在双边操作,所以记录队首元素和队尾元素
struct Queue{
struct Node* front; //队首
struct Node* rear; //队尾
};
没什么好说的很容易理解...
基本操作
栈(stack)
入栈
入栈操作,就是把新的节点压入栈的顶部,所以什么都不用返回, 用void
输入的东西应该就是 栈和要压入栈的值
void push(struct Stack* stack, int data){
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
newnode->value = data; //新节点赋值
newnode->next = stack->top; //让新节点的下一个指针指向之前的top节点
stack->top = newnode; // 这个压进栈里的元素成为新的top
}
出栈
出栈操作,就是把栈中的top节点弹出来~
那输入的东西应该只需要 stack一个
但返回值需要变成新的top 在这里面应该就是新top的value 用int类型
int pop(struct Stack* stack){
if(stack->top ==NULL){
printf("Error: stack is empty");
return -1;
}
int data = stack->top->value; //找一个data存储弹出来的值
struct Node* temp = stack->top; //这行的目的就是记录下原本的top指针方便释放内存
stack->top = stack->top->next; //原本top->next变成新的top
free(temp);
return data;
}
判断是否为空(有没有都行)
bool is_empty(struct Stack* stack){
return stack->top ==NULL;
}
看栈的size
int size(struct Stack* stack) {
if(is_empty(stack)){
return 0;
}
int count = 0;
struct Node* node = stack->top;
while (node != NULL) {
count++;
node = node->next;
}
return count;
}
队列
size和is_empty就不写了,跟栈几乎一毛一样...
入队
入队操作,是从队尾往里进,也就是说要让原本的rear->next指向newnode,让newnode变成新节点
void enqueue(struct Queue* queue, int data){
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node*));
//初始化newnode data放进去,下一节点指向空
newnode->value =data;
newnode->next=NULL;
if(queue->rear ==NULL){
queue->front= queue->rear= newnode;
}
else{
queue->rear->next = newnode; // newnode是rear->next
queue->rear = newnode; //newnode 变成新的rear
}
}
出队
出队操作,类似出栈,就是需要释放空间那块不太好记0.0
int dequeue(struct Queue* queue){
if(is_empty(queue)){ //先判断是不是空
printf("Error:the queue is already empty");
return -1;
}
int data = queue->front->value;
struct Node* temp = queue->front;
queue->front = queue->front->next;
free(temp);
return data;
}
总结
栈和队列作为基础的数据结构,后续题目很多应用...一定熟记写法!