栈:一种特殊的线性表只允许在固定的一段进行插入和删除操作,进行数据操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出的原则;
栈的示意图:
栈结构的代码实现(采用顺序表):
typedef struct stack {
char* arr;
int size;
int capacity;
}stack;
栈的操作
1、压栈:栈的插入操作;
代码实现:
void stackPush(stack* s,char c) {
if(s->size == s->capacity) {
s->capacity = s->capacity*2;
s->arr = (char*) realloc(s->arr,sizeof(char) * s->capacity);
}
s->arr[s->size++] = c;
}
2、出栈:栈的删除操作;
代码实现:
char StackPop (stack* s) {
if(s->size == 0) {
return 0;
}
else {
s->size--;
return s->arr[s->size];
}
}
队列:一种只允许在一端进行插入数据操作,在另一端进行删除操作的特殊线性表,进行插入操作的一端称为队尾,进行删除操作的一端称为队头
队列的示意图(循环队列为例):
循环队列代码实现(采用带头尾指针的顺序表实现):
typedef struct {
int front;
int rear;
int* arr;
int k;
} MyCircularQueue;
队列的主要操作:
1、入队:元素从队尾插入
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(((obj->rear+1)% (obj->k+1) ) == obj->front) {
return false;
}
else {
obj->arr[obj->rear] = value;
if(obj->rear == obj->k) {
obj->rear = 0;
}
else {
obj->rear++;
}
}
return true;
}
2、出队:元素从队头删除;
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(obj->front == obj->rear) {
return false;
}
else {
if(obj->front == obj->k) {
obj->front = 0;
}
else {
obj->front++;
}
}
return true;
}