堆栈的基本操作还是比较简单的:
欢迎大家指正错误!
//堆栈及其应用
/*
主要是两种:顺序栈和链栈
*/
/*
顺序栈的基本操作 :
1、置空栈
2、判栈空
3、判栈满
4、取栈顶元素
5、入栈
6、出栈
*/
#include <stdio.h>
#include <stdlib.h>
#define maxlen 100
typedef struct
{
int data[maxlen];
int top; //记录栈顶的元素的位置
}SeqStack;
SeqStack * InitStack(SeqStack * S) //置空栈
{
S->top = -1; //当top为0时表示还有一个元素
return S;
}
SeqStack * SetStack() //建一个空栈
{
SeqStack *S;
S = (SeqStack *)malloc(sizeof(SeqStack));
S->top = -1;
return S;
}
int StackEmpty(SeqStack * S) //顺序栈判栈空
{
if(S->top >= 0)
return 0;
else
return 1;
}
int StackFull(SeqStack * S) //顺序栈判栈满
{
if((S->top >= 0) && (S->top < maxlen - 1))
return 0;
else
return 1;
}
int GetTop(SeqStack * S) //取栈顶元素
{
if((S->top >= 0) && (S->top <= maxlen - 1))
return S->data[S->top];
else
printf("ERROR");
}
void Push(SeqStack * S, int x) //元素入栈
{
if((S->top >= -1) && (S->top <= maxlen - 1))
{
S->top++;
S->data[S->top] = x;
}
else
printf("ERROR");
}
void Pop(SeqStack * S) //元素出栈
{
if(S->top >= 0)
S->top--;
else
printf("ERROR.");
}
/*
链栈 的基本操作 (跟单链表的操作有很多相似之处)
(链栈不存在栈满的情况)
链栈其实是一个栈中元素按其逻辑顺序链接在一起的单链表
头结点为栈顶,尾结点为栈底
*/
typedef struct Node
{
int data;
struct Node * next;
} LinkStack;
LinkStack * SetStacK2() //创建空链栈
{
LinkStack *L;
L = NULL;
return L;
}
int StackEmpty2(LinkStack *L) //判栈满
{
if(L == NULL)
return 1;
else
return 0;
}
int GetTop2(LinkStack *L) //取栈顶元素
{
if(L != NULL) //若不是空栈
return L->data;
else
printf("空栈!");
}
LinkStack * Push2(LinkStack *L, int x) //元素入栈
{
LinkStack *S;
S = (LinkStack *)malloc(sizeof(LinkStack));
S->data = x;
S->next = L;
L = S;
return L;
}
LinkStack * Pop2(LinkStack *L) //元素出栈
{
if(L != NULL)
{
LinkStack *t;
t = L;
L = L->next;
free(t);
return L;
}
else
printf("空栈!");
}
int main()
{
//自己测试
}