#include<stdio.h>
#include <stdlib.h>
#define PREALLOC_MAX 1024
#define DEFAULT_CAPACITY 8
typedef int E;
typedef struct {
E* elements; // 指向堆空间的数组
int size; // 元素的个数
int capacity; // 数组的容量
} Vector;
void push_back(Vector* v, E val);
// 在数组最前面添加元素,所有元素依次后移
void push_front(Vector* v, E val);
// 删除最后一个元素, 并把最后一个元素返回
E pop_back(Vector* v);
// 删除第一个元素,并把第一个元素返回
E pop_front(Vector* v);
void grow_capacity(Vector* v);
Vector* vector_create(void);
int main(void){
// Vector v1;
Vector* v = vector_create();
/* push_back(v, 1);
push_back(v, 2);
push_back(v, 3);*/
push_front(v, 1);
push_front(v, 2);
push_front(v, 3);
int pb = pop_front(v);
printf("%d", pb);
return 0;
}
void grow_capacity(Vector* v) {
int new_capacity = v->capacity < PREALLOC_MAX ? v->capacity << 1 : v->capacity + PREALLOC_MAX;
E* p = realloc(v->elements, new_capacity * sizeof(E));
if (!p) {
printf("ERROR:REALLOC FAILED IN REALLOC\n");
exit(1);
}
v->elements = p;
v->capacity = new_capacity;
}
Vector* vector_create(void) {
Vector* v = malloc(sizeof(Vector));
if (!v) {
printf("Error: malloc failed in vector_create\n");
exit(1);
}
E* p = malloc(DEFAULT_CAPACITY * sizeof(E));
if (!p) {
free(v);
printf("Error: malloc failed in vector_create\n");
exit(1);
}
v->elements = p;
v->size = 0;
v->capacity = DEFAULT_CAPACITY;
return v;
}
void vector_destroy(Vector* v) {
free(v->elements);
free(v);
}
void push_back(Vector* v, E val) {
//判断是否需要扩容
if (v->size == v->capacity) {
grow_capacity(v);
}
v->elements[v->size++] = val;
}
void push_front(Vector* v, E val) {
//判断是否需要扩容
if (v->size == v->capacity) {
grow_capacity(v);
}
//把元素往后移动一位
for (int i = v->size - 1; i >= 0; i--)
v->elements[i+1] = v->elements[i];
//在数组最前面添加元素
v->elements[0] = val;
v->size++;
}
E pop_back(Vector* v){
//判断是否为空
if (v->size == 0)
{
printf("error:vector size is %d!!!!", v->size);
return -1;
}
//返回最后一个元素
int latter = v->elements[v->size - 1];
v->size--;
return latter;
}
E pop_front(Vector* v) {
//判断是否为空
if (v->size == 0)
{
printf("error:vector size is %d!!!!", v->size);
return -1;
}
int val = v->elements[0];
for (int i = 1; i < v->size; i++)
{
v->elements[i-1] = v->elements[i];
}
v->size--;
return val;
}