目录
栈
仅在队尾进行插入或删除操作的线性表【后进后出的线性表】
栈顶(Top):线性表表尾
栈底(Base):线性表表头
ADT
ADT Stack
{
数据对象:D = {ai|ai∈ElemSet,i = 1,2,...,n, n>= 0}
数据关系:R1 = {<ai-1,ai>|ai-1,ai∈D,i = 2,...,n}
约定an端为栈顶,ai端为栈底
基本操作:
InitStack(&S);
操作结果:构造一个空栈
DestoryStack(&S);
初始条件:栈S已存在
操作结果:栈S被销毁
ClearStack(&S)
初始条件:栈S已存在
操作结果:栈S清为空
StackEmpty(S);
初始条件:栈S已存在
操作结果:若栈S为空栈,则返回TRUE,否则返回FALSE
StackLength(&S)
初始条件:栈S已存在
操作结果:返回S元素的个数,即栈的长度
GetTop(S,&e);
初始条件:栈S已存在且非空
操作结果:用e返回栈顶的元素
Push(&S,e);
初始条件:栈S已存在
操作结果:插入元素e为新的栈顶元素
Pop(&S,&e)
初始条件:栈S已存在且非空
操作结果:删除S的栈顶元素,并用e返回其值
StackTraverse(S,visit());
初始条件:栈已存在且非空
操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit
}ADT Satck;
代码
顺序栈
// 顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指向栈顶元素在顺序栈中的元素
//数组栈:固定栈的最大元素数量,栈底用索引为0的表示
/*
struct stack
{
char data[100];
int top;
}s;
*/
#include <stdio.h>
# include<stdlib.h>
# define STACK_INIT_SIZE 100//存储空间的初始分配
# define STACKINCERMENT 10//存储空间分配增量
# define SElemType int
# define Status int
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
# define END 0
# define OVERFLOW -1
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!s)
{
printf("内存分配失败!\n");
exit(OVERFLOW);
}
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
return OK;
}
//销毁栈
Status DestoryStack(SqStack *s)
{
if (!s)
{
printf("栈不存在\n");
return ERROR;
}
int len = s->stacksize,i;
for (i = 0; i < len; ++i)
{
free(s->base);
s->base++;
}
s->base = s->top = NULL;
s->stacksize = 0;
return OK;
}
//判断栈是否为空
Status StackEmpty(SqStack s)
{
if (!&s)
{
printf("栈不存在!\n");
return ERROR;
}
if (s.top == s.base)
return TRUE;
else
return FALSE;
}
//获取栈长度
Status StackLength(SqStack s)
{
if (!&s)
{
printf("栈不存在!\n");
return ERROR;
}
if (StackEmpty(s))
{
return 0;
}
SElemType *cur = s.base;
int count = 0;
while (cur != s.top)
{
count++;
cur++;
}
return count;
}
//清空栈
Status ClearStack(SqStack *s)
{
if (!s)
{
printf("栈不存在!\n");
return ERROR;
}
s->top = s->base;
return OK;
}
//压栈
Status Push(SqStack *s,SElemType e)
{
//判断栈满
if (s->top - s->base == s->stacksize)
{
s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCERMENT) * sizeof(SElemType));
if (!s)
{
printf("内存分配失败!\n");
exit(OVERFLOW);
}
s->top = s->base + s->stacksize;
s->stacksize += STACKINCERMENT;
}
*(s->top) = e;
s->top++;
return OK;
}
//出栈
Status Pop(SqStack *s, SElemType *e)
{
if (StackEmpty(*s))
{
printf("空栈\n");
return ERROR;
}
*e = *--s->top;
return OK;
}
//获取栈顶元素
Status GetTop(SqStack s, SElemType *e)
{
if (s.top == s.base)
{
printf("空栈!\n");
return ERROR;
}
*e = *(s.top - 1);
return OK;
}
//访问函数
Status visit(SElemType e)
{
printf("%d ",e);
return OK;
}
//遍历栈
Status StackTraverse(SqStack s, Status(*visit)(SElemType e))
{
if (!&s)
{
printf("栈不存在!\n");
return ERROR;
}
if (StackEmpty(s))
{
printf("栈为空!\n");
return ERROR;
}
SElemType *cur = s.base;
while (cur != s.top)
{
visit(*cur);
cur++;
}
printf("\n");
return OK;
}
int main()
{
SqStack stack;
SElemType data;
int n,i;
InitStack(&stack);
printf("输入压栈次数:\n");
scanf_s("%d", &n);
printf("输入栈中数据元素:\n");
for (i = 1; i <= n; ++i)
{
scanf_s("%d", &data);
Push(&stack, data);
}
printf("遍历栈:\n");
StackTraverse(stack, visit);
/*
if (DestoryStack(&stack))
printf("OK\n");
printf("弹出栈顶元素为:\n");
Pop(&stack, &data);
printf("%d\n",data);
printf("栈中元素数量为:%d\n", StackLength(stack));
GetTop(stack, &data);
printf("栈顶元素是:%d\n",data);
*/
return 0;
}
链式栈
// 链式栈.cpp : 定义控制台应用程序的入口点。
//单链表实现栈
#include <stdio.h>
# include<stdlib.h>
# define SElemType int
# define Status int
# define OK 1
# define FALSE 0
# define OVERFLOW -1
# define TRUE 1
# define ERROR 0
typedef struct LNode
{
SElemType data;
struct LNode *next;
}SNode, *SqStack;
//初始化栈
Status InitStack(SqStack *s)
{
SNode *head = (SNode *)malloc(1 * sizeof(SNode));
head->next = NULL;
if (!head)
{
printf("内存分配失败!\n");
return ERROR;
}
*s = head;
return OK;
}
//清空栈
Status ClearStack(SqStack *s)
{
SNode *p, *q;
p = (*s)->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
return OK;
}
//销毁栈
Status DestoryStack(SqStack *s)
{
if (!(*s))
{
printf("栈不存在!\n");
return ERROR;
}
ClearStack(s);
free(*s);
return OK;
}
//获取栈中元素数量
Status LengthStack(SqStack s)
{
int len = 0;
SNode *target = s->next;
while (target)
{
len++;
target = target->next;
}
return len;
}
//判断空栈
Status EmptyStack(SqStack s)
{
if (s->next == NULL)
return TRUE;
else
return FALSE;
}
//压栈(头插法)
Status push(SqStack *s, SElemType data)
{
SNode *node = (SNode *)malloc(1 * sizeof(SNode));
node->data = data;
node->next = (*s)->next;
(*s)->next = node;
return OK;
}
//弹出栈
Status pop(SqStack *s, SElemType *data)
{
if (EmptyStack(*s))
{
printf("空栈\n");
return ERROR;
}
SNode *p = (SNode *)malloc(1 * sizeof(SNode));
p = (*s)->next;
(*s)->next = p->next;
*data = p->data;
free(p);
return OK;
}
//访问函数
Status visit(SElemType e)
{
printf("%d ",e);
return OK;
}
//遍历栈
Status TraverseStack(SqStack s,Status (*visit)(SElemType e))
{
if (!s)
{
printf("栈不存在!\n");
return ERROR;
}
if (EmptyStack(s))
{
printf("空栈!\n");
return ERROR;
}
SNode *target = s->next;
for (; target; target = target->next)
{
visit(target->data);
}
return OK;
}
//返回栈顶元素
Status GetTop(SqStack s,SElemType *e)
{
if (!s)
{
printf("栈不存在!\n");
return ERROR;
}
if (EmptyStack(s))
{
printf("空栈\n");
return ERROR;
}
*e = s->next->data;
return OK;
}
int main()
{
SqStack stack;
int n;
SElemType data;
InitStack(&stack);
printf("输入栈的元素个数:");
scanf_s("%d", &n);
while (n--)
{
scanf_s("%d",&data);
push(&stack, data);
}
printf("遍历栈\n");
TraverseStack(stack, visit);
DestoryStack(&stack);
/*
pop(&stack, &data);
printf("删除的元素是:%d\n",data);
printf("遍历栈\n");
TraverseStack(stack, visit);
GetTop(stack, &data);
printf("栈顶元素为:%d\n",data);
//printf("栈元素个数为:%d\n",LengthStack(stack));
*/
return 0;
}