c栈操作

来源:互联网 发布:淘宝新店刷信誉 编辑:程序博客网 时间:2024/06/03 23:10
 
001#include<stdio.h>
002#include<stdlib.h>
003#define STACK_SIZE 100          //栈初始大小
004#define AUTO_INCREMENT 10       //自增大小
005 
006typedef struct{
007    int*base;
008    int*top;
009    intstacksize;
010}sqStack;
011 
012/**
013 * 初始化一个栈
014 **/
015void init(sqStack *s) {
016    s->base = (int*)malloc(STACK_SIZE*sizeof(int));
017    if( !s->base ) exit(0);
018    s->top = s->base;
019    s->stacksize = STACK_SIZE;
020}
021/**
022 * 压栈操作
023 **/
024void push(sqStack *s, int e) {
025    if( s->top - s->base == s->stacksize ) {
026        s->base = (int*)realloc(s->base, AUTO_INCREMENT);
027        if(!s->base) exit(0);
028        s->top = s->base + s->stacksize;
029        s->stacksize += AUTO_INCREMENT;
030    }
031    *(s->top) = e;
032    s->top++;
033}
034 
035/**
036 * 出栈操作
037 **/
038int pop(sqStack *s) {
039    if( s->top == s->base ) return-1;
040    return*(--s->top);
041}
042 
043/**
044 * 获取栈的当前容量
045 **/
046int getSize(sqStack s) {
047    return(s.top - s.base);
048}
049 
050/**
051 * 清空栈
052 **/
053void clearStack(sqStack *s) {
054    s->top = s->base;
055}
056 
057/**
058 * 销毁栈
059 **/
060void destoryStack(sqStack *s) {
061    if( s->top == s->base ) return;
062    while( s->top != s->base ) {
063        free(s->top);
064        s->top--;
065    }
066    free(s->top);
067    s->top = s->base = NULL;
068    s->stacksize = 0;
069}
070 
071/**
072 * 遍历栈
073 **/
074void showStack(sqStack s) {
075    if( s.top == s.base ) return;
076    --s.top;                   //top指针是指向栈顶的上一个地址的,所以需要先减一
077    while( s.top != s.base ) {
078        printf("%d ", *(s.top));
079        s.top--;
080    }
081    printf("%d\n", *(s.top));  //打印出最后一个元素
082}
083 
084int main() {
085    sqStack s;
086    inti,size;
087    init(&s);
088    push(&s, 3);
089    push(&s, 4);
090    push(&s, 5);
091    showStack(s);
092     
093    size = getSize(s);
094    printf("curSize:%d\n", size);
095     
096    i = pop(&s);
097    printf("%d\n", i);
098     
099    i = pop(&s);
100    printf("%d\n", i);
101     
102    i = pop(&s);
103    printf("%d\n", i);
104     
105    i = pop(&s);
106    printf("%d\n", i);
107    return0;
108}