用指针比用数组好,这样用户可以自己指定空间的大小,有参与感。
全部代码:
main.c
cpp
#include <stdio.h>
#include <string.h>
#include "sqstack.h"
int main(int argc, char *argv[])
{
sqstack *s;
int i;
s = stack_create(100);
if(s == NULL)
return -1;
stack_push(s,100);
stack_push(s,90);
stack_push(s,80);
stack_push(s,70);
stack_push(s,60);
for(i = 0; i <= s->top; i++)//显示栈中的元素
{
printf("%d\n", s->data[i]);
}
while(!stack_empty(s)) {
printf("pop : %d\n",stack_pop(s));
}
stack_free(s);
return 0;
}
sqstack.c
cpp
#include <stdio.h>
#include <stdlib.h>
#include "sqstack.h"
#include <string.h>
/* 要创建一个结构体的栈,和一个放数据的栈 */
sqstack * stack_create(int len){
sqstack *s;
if((s = (sqstack *)malloc(sizeof(sqstack))) == NULL) {
printf("malloc sqstack failed\n");
return NULL;
}
if(((s->data) = (data_t *)malloc(len * sizeof(data_t))) == NULL) {
printf("malloc data failed\n");
return NULL;
}
memset(s->data, 0, len * sizeof(data_t));
s->maxlen = len;
s->top = -1;
return s;
}
int stack_push(sqstack *s, data_t value){
if(s == NULL) {
printf("s is NULL\n");
return -1;
}
if(s->top == s->maxlen -1) {
printf("stack is full\n");
return -1;
}
s->top ++;
s->data[s->top] = value;
return 0;
}
/* 1-empty */
int stack_empty(sqstack *s){
if(s == NULL) {
printf("s is NULL\n ");
return -1;
}
return (s->top == -1 ? 1 : 0);
}
/* 1-full */
int stack_full(sqstack *s){
if(s == NULL) {
printf("s is NULL\n");
return -1;
}
return (s->top == s->maxlen - 1 ? 1 : 0);
}
data_t stack_pop(sqstack *s){
s->top--;
return (s->data[s->top+1]);
}
//显示top的值
data_t stack_top(sqstack *s){
return (s->data[s->top]);
}
int stack_clear(sqstack *s){
if(s == NULL)
{
printf("s is NULL\n");
return -1;
}
s->top = -1;
return 0;
}
//有几个malloc就有几个free
int stack_free(sqstack *s){
if(s == NULL)
{
printf("s is NULL\n");
return -1;
}
if(s->data != NULL)//开辟栈可能失败
{
free(s->data);
}
free(s);
return 0;
}
sqstack.h
cpp
typedef int data_t;
typedef struct{
data_t *data;
int maxlen;
int top;
}sqstack;
sqstack * stack_create(int len);
int stack_push(sqstack *s, data_t value);
int stack_empty(sqstack *s);
int stack_full(sqstack *s);
data_t stack_pop(sqstack *s);
data_t stack_top(sqstack *s);
int stack_clear(sqstack *s);
int stack_free(sqstack *s);