/*
* stack.h
* 顺序栈
* Created on: 2011-9-4
* Author: liusheng
*/
#ifndef STACK_H_
#define STACK_H_
#define ElemType int
#define TRUE 1
#define FALSE 0
#define INIT_STACK_SIZE 3
#define ADD_NODE_LENGTH 5
/*
* 非空栈的栈顶指针一定指向栈定元素的下一个位置
* top = base 可做为栈空的标记
* */
typedef struct {
ElemType *base;
ElemType *top;
int size;
}sqstack;
//初始化栈
int initstack(sqstack *s) {
s->base = (ElemType *)malloc(sizeof(ElemType) * INIT_STACK_SIZE);
if(s->base == NULL) return FALSE;
s->top = s->base;
s->size = INIT_STACK_SIZE;
return TRUE;
}
//压栈,该过程中要判断栈是否已满,此时要通过top与base的比较
int push(sqstack *s,ElemType e) {
if(s->top - s->base == s->size) {
ElemType *newbase;
newbase = (ElemType *)realloc(s->base,(s->size + ADD_NODE_LENGTH) * sizeof(ElemType));
if(newbase == NULL) return FALSE;
s->base = newbase;
s->top = s->base + s->size;
s->size += ADD_NODE_LENGTH;
}
*(s->top) = e;
s->top ++;
return TRUE;
}
//得到栈顶元素
int gettopelem(sqstack *s,ElemType *e) {
if(s->top == s->base) return FALSE;
*e = *(s->top - 1);
return TRUE;
}
//出栈,将栈顶元素从栈中取出
int pop(sqstack *s,ElemType *e) {
if(s->top == s->base) return FALSE;
s->top --;
*e = *(s->top);
return TRUE;
}
//输出栈中的所有数据,前提是栈不为空
void printfstack(sqstack *s) {
ElemType *temp;
temp = s->top;
while(temp > s->base) {
temp --;
printf("elem = %d\n",*temp);
}
printf("size = %d\n",s->size);
}
#endif /* STACK_H_ */
/*
* sqstack.c
* 测试顺序栈
* Created on: 2011-9-4
* Author: liusheng
*/
#include <stdio.h>
#include <stdlib.h>
#include "sq_stack.h"
int main(void) {
sqstack s;
initstack(&s);
push(&s,1);
push(&s,2);
push(&s,4);
push(&s,3);
printfstack(&s);
//测试pop()
int e;
pop(&s,&e);
printf("e = %d\n",e);
printfstack(&s);
//测试gettopelem()
gettopelem(&s,&e);
printf("e = %d\n",e);
printfstack(&s);
return 0;
}
//以下是测试代码的输出部分
elem = 3
elem = 4
elem = 2
elem = 1
size = 8
e = 3
elem = 4
elem = 2
elem = 1
size = 8
e = 4
elem = 4
elem = 2
elem = 1
size = 8
C语言实现顺序栈
最新推荐文章于 2021-05-22 05:18:54 发布