#include <颤颂stdlib.h>
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */
typedef struct SqStack
{
SElemType *base/* 在栈构造之前和销毁之后,base的值为NULL */
SElemType *top/* 栈顶指针 */
int stacksize/* 当前已分配的存储空间,以元素为单位 */
}SqStack/* 顺序栈 */
Status InitStack(SqStack *S)
{ /* 构造一个空栈S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))
if(!(*S).base)
exit(OVERFLOW)/* 存储分配失败 */
(*S).top=(*S).base
(*S).stacksize=STACK_INIT_SIZE
return OK
}
Status DestroyStack(SqStack *S)
{ /* 销毁栈S,S不再存在 */
free((*S).base)
(*S).base=NULL
(*S).top=NULL
(*S).stacksize=0
return OK
}
Status ClearStack(SqStack *S)
{ /* 把S置为空栈 */
(*S).top=(*S).base
return OK
}
Status StackEmpty(SqStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
if(S.top==S.base)
return TRUE
else
return FALSE
}
int StackLength(SqStack S)
{ /* 返回S的元素个数,即栈的长度 */
return S.top-S.base
}
Status GetTop(SqStack S,SElemType *e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
if(S.top>S.base)
{
*e=*(S.top-1)
return OK
}
else
return ERROR
}
Status Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空键侍间 */
{
(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType))
if(!(*S).base)
exit(OVERFLOW)/* 存储分配失败 */
(*S).top=(*S).base+(*S).stacksize
(*S).stacksize+=STACKINCREMENT
}
*((*S).top)++=e
return OK
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).base)
return ERROR
*e=*--(*S).top
return OK
}
Status StackTraverse(SqStack S,Status(*visit)(SElemType))
{ /* 从栈底到栈顶依次对栈中每个元素调用函茄亮郑数visit()。 */
/* 一旦visit()失败,则 *** 作失败 */
while(S.top>S.base)
visit(*S.base++)
printf("\n")
return OK
}
#include <stdio.h>#include <stdlib.h>缺物
#define MAX 1024///栈使用数组模拟,MAX是最大元素个数
typedef int DataType ///数据域使用整形
typedef struct _stack
{
DataType data[MAX]//悄扮高/存放数据
int top ///栈顶指针
}stack
///初始化
int initStack(stack (*s))
{
return emptyStack(s)
}
///数据压栈,成功返回1,失败返回0
int push(stack (*s), DataType d)
{
if ((*s).top >= MAX - 1) //栈已满
{
printf("栈已满,不能压栈\n")
return 0
}
//数据压栈
(*s).top++
(*s).data[(*s).top] = d
return 1
}
///数据出栈,成功返回1,d指向的区启尺域存储d出的数据,失败返回0
int pop(stack (*s), DataType *d)
{
if ((*s).top <= -1)
{
printf("栈为空,不能出栈\n")
return 0
}
//出栈
*d = (*s).data[(*s).top]
(*s).top--
return 1
}
///清空栈
int emptyStack(stack (*s))
{
(*s).top = -1
return 1
}
int main(int argc, char** argv)
{
stack s
int i, d
initStack(&s)
//压栈
for (i = 0i <1025i++)
{
push(&s, i)
}
//清空
emptyStack(&s)
for (i = 0i <10i++)
{
push(&s, i)
}
//出栈
for (i = 0i <11i++)
{
pop(&s, &d)
printf("%d\n", d)
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)