001 | #include<stdio.h> |
002 | #include<stdlib.h> |
003 | #define STACK_SIZE 100 //栈初始大小 |
004 | #define AUTO_INCREMENT 10 //自增大小 |
005 |
006 | typedef
struct { |
007 | int
*base; |
008 | int
*top; |
009 | int
stacksize; |
010 | }sqStack; |
011 |
012 | /** |
013 | * 初始化一个栈 |
014 | **/ |
015 | void
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 | **/ |
024 | void
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 | **/ |
038 | int
pop(sqStack *s) { |
039 | if
( s->top == s->base ) return
-1; |
040 | return
*(--s->top); |
041 | } |
042 |
043 | /** |
044 | * 获取栈的当前容量 |
045 | **/ |
046 | int
getSize(sqStack s) { |
047 | return
(s.top - s.base); |
048 | } |
049 |
050 | /** |
051 | * 清空栈 |
052 | **/ |
053 | void
clearStack(sqStack *s) { |
054 | s->top = s->base; |
055 | } |
056 |
057 | /** |
058 | * 销毁栈 |
059 | **/ |
060 | void
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 | **/ |
074 | void
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 |
084 | int
main() { |
085 | sqStack s; |
086 | int
i,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 | return
0; |
108 | } |