C语言实现顺序栈

/*
 * 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





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值