参考《大话数据结构》:
环境:ubuntu16.04 vim
文件名称:sqstack.h sqstack.c main.c Makefile(放到同一个目录下)
实现功能:栈的初始化,入栈,出栈
1.sqstack.h头文件
#ifndef __SQSTACK_HEAD__
#define __SQSTACK_HEAD__
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
#define OK 0
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int top;
}SqStack;
/*extern 是变量或函数的申明,告诉编译器在其它文件中找这个变量或函数的定义*/
/*
*初始化一个栈,让其栈顶元素下标为-1
*s [IN, OUT]执行操作的栈
*/
extern void StackInit(SqStack *s);
/*
*插入新的栈顶元素
*s [IN, OUT]执行操作的栈
*e [IN]要插入栈顶的元素
*/
extern Status Push(SqStack *s, ElemType e);
/*
*若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
*s [IN, OUT]执行操作的栈
*e [IN, OUT]要删除的栈顶元素
*/
extern Status Pop(SqStack *s, ElemType *e);
#endif
2.sqstack.c文件
#include "sqstack.h"
/*初始化栈*/
void StackInit(SqStack *s)
{
s->top = -1; //初始化为空表
}
/*插入新的栈顶元素*/
Status Push(SqStack *s, ElemType e)
{
if (s->top == MAXSIZE -1) //栈满
{
return ERROR;
}
s->top++; //栈顶指针增加一
s->data[s->top] = e; //将新插入元素赋值给栈顶空间
return OK;
}
/*若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK,否则返回ERROR*/
Status Pop(SqStack *s, ElemType *e)
{
if (s->top == -1)
{
return ERROR;
}
*e = s->data[s->top]; //将要删除的栈顶元素赋值给e
s->top--; //栈顶指针减一
return OK;
}
3.main.c主函数
#include "sqstack.h"
int main()
{
SqStack s;
//初始化栈
StackInit(&s);
//入栈
if (Push(&s, 3))
{
printf("push failed!\n");
return ERROR;
}
printf("s.data[s.top]:%d\n", s.data[s.top]);
//出栈
ElemType e = 0;
if (Pop(&s, &e))
{
printf("pop failed!\n");
return ERROR;
}
printf("e:%d\n", e);
return OK;
}
4.Makefile文件
#Makefile for building programmings
OBJS=sqstack.o main.o
CC=gcc
CFLAGS=-Wall -g
TARGET=sqstack
TARGET:$(OBJS)
$(CC) $(OBJS) -o $(TARGET)
sqstack.o:sqstack.c sqstack.h
$(CC) $(CFLAGS) -c $< -o $@
main.o:main.c sqstack.h
$(CC) $(CFLAGS) -c $< -o $@
.PHONY:clean
clean:
rm *.o sqstack
5.执行结果