栈的具体原理就不讲了,其主要特点是Last in First Out(LIFO),只在末尾(栈顶)进行删除和插入操作。
看书的时候发现两个比较细节的东西(了解即可)分享给大家:
用链表实现的栈的缺点在于对malloc和free函数的调用的开销是昂贵的;
用数组实现的栈的潜在危害是需要提前申明一个数组的大小,除此之外,
还要对pop空栈与push满栈进行错误检测,会花费较多的时间
下面贴出代码,代码只是简单的实现了push和pop操作,具体如下:
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define Status int
#define OK 1
#define ERROR 0
typedef struct {
int *base;
int *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *S);
Status Push(SqStack *S,int e);
Status Pop(SqStack *S,int *e);
int getLength(SqStack *S);
int main()
{
SqStack S;
int a,i,length,num[5]={1,2,3,4,5};
InitStack(&S);
for(i = 0 ; i < 5; i++) {
Push(&S,num[i]);
}
length = getLength(&S);
for(i=0;i<length;i++) {
Pop(&S,&a);
printf("%d ",a);
}
return 1;
}
Status InitStack(SqStack *S) {
S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
if (!S->base) {
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack *S,int e) {
if (S->top - S->base >= S->stacksize)
{
S->base = (int *)realloc(S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
exit(0);
}
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top) = e;
S->top++;
return OK;
}
Status Pop(SqStack *S,int *e) {
if (S->top == S->base) {
return ERROR;
}
*e = *--S->top;
return OK;
}
int getLength(SqStack *S) {
return S->top - S->base;
}