我们常常听说栈与堆,栈与堆的,但是实际上在操作系统中这些玩意都是十分重要的,所以我打算一个一个写。

栈的定义和长什么样异常简单,随随便便都能找到对应的图,但是我为什么要拿出来写呢,是因为我想顺手就把栈的应用写了。、

在学习计算机组成原理,操作系统原理的时候我们总能看到中断这个字眼,中断是现在计算机最重要的特性,如果没有中断操作的话,你现在就不能想干啥就跳去干啥了,还能回来接着干(你:不局限用户,还有进程,线程等),那么当中断发生的时候,计算机就会把当前运行的程序的所有信息全部压入寄存器的栈中,当我们中断结束的时候,就可以将刚刚的信息全部吐出来,恢复原样,这就暗示了栈一般拿来干什么,

就是一种需要隐式记录先来后到的顺序的数据结构,而上面说的中断就是个很典型的例子,说中断可能大家体会不深,那么我们来说最常见的比如浏览器历史,我们回忆一下我们的游览器历史是不是就是倒着来的,而且都是按时间(先来后到)的顺序来的,还有各种前中后缀表达式,函数调用的实现,文本编辑器撤销的实现等等,总而言之,栈是一个非常重要的数据结构。

ok,在上面我们只说了栈是个什么玩意,可是栈内的数据是要什么格式我们不知道,同时栈这个数据结构是我们想出来的,这就代表我们可以用多个方式实现它   

注:我们下面的代码都是规定数据格式为int

实现方式一:基于数组

struct stack{
    int top;
    int capacity;
    int *array;
};
struct stack* create()
{
    struct stack* s = new(stack);
    if(!s){
    cout<<"error,could not create stack";
    return Null;}
    s->top = -1;
    s->capacity = 1;
    s->array = new(s->capacity * sizeof(int));
    if(!s->array){
    cout<<"error,could not create array";
    return Null;
    }
    return s;
}
int isEmpty(struct stack* s)
{
    return(s->top == -1)
}
int isFull(struct stack* s)
{
    return (s->top == s->capacity-1)
}
void push(struct stack* s,int data)
{
    if(isFull(s))
    cout<<"Full";
    
    s->top++;
    s->array[s->top] = data;
}
int pop(struct stack *s)
{
    if(isEmpty(s))
    {
        cout<<"empty";
        return 0;
    }
    s->top--;
    return (s->array[s->top])
}
void deletestack(struct stack * s)
{
    
    if(s){
        if(s->array)
        free(s->array);
    free(s);
        }
}

当然还有基于动态数组的方法实现和基于链表的方式实现

动态数组:记住不要每一次一个一个的增加,这会极大增加开销,因为每一次都要复制,我们直接每一次溢出的时候,直接造一个大一倍的数组进行存放

链表:push就是在链表的头部再加一个,pop就是拿掉头部那一个