我们常常听说栈与堆,栈与堆的,但是实际上在操作系统中这些玩意都是十分重要的,所以我打算一个一个写。
栈的定义和长什么样异常简单,随随便便都能找到对应的图,但是我为什么要拿出来写呢,是因为我想顺手就把栈的应用写了。、
在学习计算机组成原理,操作系统原理的时候我们总能看到中断这个字眼,中断是现在计算机最重要的特性,如果没有中断操作的话,你现在就不能想干啥就跳去干啥了,还能回来接着干(你:不局限用户,还有进程,线程等),那么当中断发生的时候,计算机就会把当前运行的程序的所有信息全部压入寄存器的栈中,当我们中断结束的时候,就可以将刚刚的信息全部吐出来,恢复原样,这就暗示了栈一般拿来干什么,
就是一种需要隐式记录先来后到的顺序的数据结构,而上面说的中断就是个很典型的例子,说中断可能大家体会不深,那么我们来说最常见的比如浏览器历史,我们回忆一下我们的游览器历史是不是就是倒着来的,而且都是按时间(先来后到)的顺序来的,还有各种前中后缀表达式,函数调用的实现,文本编辑器撤销的实现等等,总而言之,栈是一个非常重要的数据结构。
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就是拿掉头部那一个
浙公网安备 33010602011771号