栈是一个后进先出 (Last In First Out, LIFO) 的线性表。
顺序栈的C语言实现
头文件
#include<stdio.h>
#include<stdlib.h>
//结果函数状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;// Status--函数的类型,其值是函数结果的状态代码
typedef int SElemType;
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用最大容量
}SqStack;
初始化:构造一个空栈
Status InitStack(SqStack *S) //初始化:构造一个空栈
{
S->base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType)); //分配内存空间
if(!S->base) exit (OVERFLOW); //分配内存空间失败
S->top = S->base; //栈顶指针等于栈底指针
S->stacksize = MAXSIZE;
return OK;
}
判断顺序栈是否为空
Status StackEmpty(SqStack S) //判断顺序栈是否为空
{
if(S.top == S.base) return TRUE; //空返回1
else return FALSE; //非空返回0
}
输出显示顺序栈
void ShowStack(SqStack S) //输出显示顺序栈
{
while(S.top != S.base)
{
*S.top--;
printf("%d,",*S.top);
}
printf("\n");
}
求顺序栈长度
int StackLength(SqStack S) //求顺序栈长度
{
return S.top - S.base;
}
清空顺序栈
Status ClearStack(SqStack *S) //清空顺序栈——将 top 指针指向栈底base即可
{
if(S->base) S->top = S->base;
return OK;
}
销毁顺序栈
Status DestoryStack(SqStack *S) //销毁顺序栈
{
if(S->base)
{
free(S->base); //释放内存空间
S->stacksize = 0;
S->base = S->top = NULL;
}
return OK;
}
入栈—压栈
Status PushStack(SqStack *S, SElemType e) //入栈---压栈
{
if(S->top - S->base == S->stacksize) return ERROR; //栈满
// *S->top ++= e;
*S->top = e;
*S->top ++;
return OK;
}
出站,出站元素保存在 e中
Status PopStack(SqStack *S, SElemType *e) // 出站,出站元素保存在 e中
{
/*若栈为空,删除S的栈顶元素,用e返回值,返回 OK;
否则返回 ERROR*/
if(S->top == S->base) return ERROR;
// e = *--S->top
--S->top; //指针下移
*e = *S->top;
return OK;
}
主函数
int main()
{
Status InitStack(SqStack *S); //初始化:构造一个空栈
Status StackEmpty(SqStack S); //判断顺序栈是否为空
int StackLength(SqStack S); //求顺序栈长度
Status ClearStack(SqStack *S); //清空顺序栈
Status DestoryStack(SqStack *S); //销毁顺序表
void ShowStack(SqStack S); //输出显示顺序栈
Status PushStack(SqStack *S, SElemType e); //入栈---压栈
Status PopStack(SqStack *S, SElemType *e); // 出站,出站元素保存在 e中
SqStack S;
InitStack(&S);
if(StackEmpty(S)) printf("空栈\n");
else printf("栈非空\n");
int i;
for(i=0;i<10;i++)
{
PushStack(&S, i);
}
printf("栈长度:%d\n", StackLength(S));
ShowStack(S);
ClearStack(&S);
printf("栈长度:%d\n", StackLength(S));
}