栈的实现

来源:互联网 发布:ug编程待遇怎么样工资 编辑:程序博客网 时间:2024/05/17 06:29
/* 栈,先进后出 */#include<stdio.h>#include<malloc.h>#define N 1  //初始化内存大小,以元素为单位 #define M 1  //内存扩增,以元素为单位 struct stack {int *base;int *top; int n;  //记录栈的内存大小,以元素为单位 };/*定义一个栈对象*/ struct stack S;void initStack();void push(int e);void getTop(int &e);void delTop(int &e);int length();main() {int a;/*************************/ /*初始化一个栈,此时,元素个数为0,内存大小为1*/initStack();printf("元素个数为:%d\n", length());printf("内存大小为:%d\n\n", S.n);/*************************/ printf("*******************************\n"); /*************************/ push(11);getTop(a);printf("栈顶元素为:%d\n", a);printf("元素个数为:%d\n", length());printf("内存大小为:%d\n\n", S.n);/*************************/ printf("*******************************\n"); /*************************/ push(22);push(33);push(44);getTop(a);printf("栈顶元素为:%d\n", a);printf("元素个数为:%d\n", length());printf("内存大小为:%d\n\n", S.n);delTop(a);/*删除栈顶元素*/printf("删除的栈顶元素为: %d\n", a);getTop(a);printf("删除后。。。\n");getTop(a);printf("栈顶元素为:%d\n", a);printf("元素个数为:%d\n", length());printf("内存大小为:%d\n\n", S.n);/*************************/ }/*初始化一个栈*/void initStack() {//构造一个空栈SS.base = (int *)malloc(N*sizeof(int));if(!S.base) {printf("error"); return; }S.top = S.base;S.n = N; //初始化栈内存大小 } /*插入新的栈顶元素*/ void push(int e) {//插入元素e为新的栈顶元素if(S.top-S.base >= S.n-1) {//内存不足,自动追加/*realloc函数,最好自己去问度娘*/ S.base = (int *)realloc(S.base, (S.n + M)*sizeof(int)); if(!S.base) {printf("error");return;}S.top = S.base + S.n; // S.n += M;} *S.top++ = e;/*栈顶指针的内容为空(看书上图),将e赋给它,然后top加1*/ }/*取出栈顶元素*/void getTop(int &e) {//若栈不为空,用e返回大小if(S.top == S.base) {printf("error");return;} e = *(S.top - 1);}/*删除栈顶元素*/void delTop(int &e) {if(S.top == S.base) {printf("error");return;}e = *--S.top;/*top指针先减1以指向栈顶元素(top指针实际并不是指向栈顶元素)将栈顶元素返回后,top指针减1*/ } /*很重要的一点,删除栈顶元素实际上是对栈顶指针而言的,也就是说那块内存还存着那个数,所谓的删除,只是你不访问而已*//*栈中的元素个数*/int length() { if(S.top == S.base)return 0;return (S.top-S.base)/M - 1;}

原创粉丝点击