栈是一种操作受限的数据结构,只允许从一段操作,而且先进后出(FILO first in last out)这里将栈的操作封装在C语言的头文件里
实现栈的代码如下
#include<stdbool.h>
#define maxsize 10
typedef int datatype;
//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
datatype data[maxsize];
int top;
};
typedef struct stack Stack;
//创建栈
Stack s;
//初始化栈
void init()
{
s.top=-1;
}
//判断栈是否为空
bool Empty()
{
if(s.top==-1)
{
return true;
}
else
{
return false;
}
}
//判断栈是否已满了
bool full()
{
if(s.top==maxsize-1)
{
return true;
}
else
{
return false;
}
}
//入栈
void Push(datatype element)
{
if(!full())
{
s.top++;
s.data[s.top]=element;
}
else
{
printf("栈满\n");
}
}
//出栈
void Pop()
{
if(!Empty())
{
s.top--;
}
else
{
printf("栈空\n");
}
}
//取栈顶元素
datatype Top()
{
if(!Empty())
{
return s.data[s.top];
}
else
{
printf("栈空\n");
}
}
//销毁栈
void Destroy()
{
s.top=-1;
}
测试栈的代码如下:
#include<stdio.h>
#include "SequenceStack.h"
int main()
{
int i=0;
// struct stack s;
//初始化栈
printf("\n###########初始化栈###########\n");
init();
printf("----------------------------------");
//入栈操作
printf("\n###########入栈操作###########\n");
for(i=0;i<=10;i++)
{
Push(i);
}
printf("----------------------------------");
printf("\n###########取栈顶元素###########\n");
printf("%d\n",Top());
printf("----------------------------------");
//出栈操作
printf("\n###########出栈操作###########\n");
for(i=0;i<=10;i++)
{
Pop();
}
printf("----------------------------------");
printf("\n###########取栈顶元素###########\n");
Top();
printf("----------------------------------");
printf("\n###########销毁栈###########\n");
Push(10);
Destroy();
Top();
}
这样实现栈,宏定义处maxsize表示栈的大小,方便以后修改,typedef也是同样的效果,可以随时改变数据类型。
在操作栈的时候也只要用到push、pop、top、等方法就可以了
这样的栈有一个明显的缺点,是栈被定义在头文件里,这样使用者只能使用一个栈,无法同时建立两个栈,考虑到这一点,对栈的代码做出修改
实现栈的代码
#include<stdbool.h>
#define maxsize 10
typedef int datatype;
//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
datatype data[maxsize];
int top;
};
typedef struct stack Stack;
//创建栈
// Stack s;
//初始化栈
void init(Stack *s)
{
s->top=-1;
}
//判断栈是否为空
bool Empty(Stack *s)
{
if(s->top==-1)
{
return true;
}
else
{
return false;
}
}
//判断栈是否已满了
bool full(Stack *s)
{
if(s->top==maxsize-1)
{
return true;
}
else
{
return false;
}
}
//入栈
void Push(Stack *s,datatype element)
{
if(!full(s))
{
s->top++;
s->data[s->top]=element;
}
else
{
printf("栈满\n");
}
}
//出栈
void Pop(Stack *s)
{
if(!Empty(s))
{
s->top--;
}
else
{
printf("栈空\n");
}
}
//取栈顶元素
datatype Top(Stack *s)
{
if(!Empty(s))
{
return s->data[s->top];
}
else
{
printf("栈空\n");
}
}
//销毁栈
void Destroy(Stack *s)
{
s->top=-1;
}
测试栈的代码
#include<stdio.h>
#include "SequenceStack1.0.h"
int main()
{
int i=0;
Stack p;
Stack *s;
s=&p;
// struct stack s;
//初始化栈
printf("\n###########初始化栈###########\n");
init(s);
printf("----------------------------------");
//入栈操作
printf("\n###########入栈操作###########\n");
for(i=0;i<=10;i++)
{
Push(s,i);
}
printf("----------------------------------");
//取栈顶元素
printf("\n###########取栈顶元素###########\n");
printf("%d\n",Top(s));
printf("----------------------------------");
//出栈操作
printf("\n###########出栈操作###########\n");
for(i=0;i<=12;i++)
{
Pop(s);
}
printf("----------------------------------");
//取栈顶元素
printf("\n###########取栈顶元素###########\n");
Top(s);
printf("----------------------------------");
//销毁栈
printf("\n###########销毁栈###########\n");
Push(s,10);
Destroy(s);
Top(s);
}
这里可以在主函数中自己定义栈,从而同时实现多个栈,但是这样的栈还是大小固定的,每次修改maxsize很麻烦,所以想到malloc函数,对栈的代码做了进一步的修改
实现栈的代码
#include<stdbool.h>
#include<stdlib.h>
#define maxsize 10
typedef int datatype;
//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
datatype *data;
int top;
};
typedef struct stack Stack;
//创建栈
int realsize=maxsize;
// Stack s;
//初始化栈
void init(Stack *s)
{
s->data = (datatype *)malloc(sizeof(datatype)*maxsize);
s->top=-1;
}
//判断栈是否为空
bool Empty(Stack *s)
{
if(s->top==-1)
{
return true;
}
else
{
return false;
}
}
//判断栈是否已满了
void full(Stack *s)
{
if(s->top==realsize-1)
{
realsize++;
s->data=(datatype *)realloc(s->data,realsize*sizeof(datatype));
}
}
//入栈
void Push(Stack *s,datatype element)
{
full(s);
s->top++;
s->data[s->top]=element;
}
//出栈
void Pop(Stack *s)
{
if(!Empty(s))
{
s->top--;
}
else
{
printf("栈空\n");
}
}
//取栈顶元素
datatype Top(Stack *s)
{
if(!Empty(s))
{
return s->data[s->top];
}
else
{
printf("栈空\n");
}
}
//销毁栈
void Destroy(Stack *s)
{
s->top=-1;
free(s->data); //释放堆上内存
}
测试栈的代码
#include<stdio.h>
#include "DynamicStack1.0.h"
int main()
{
int i=0;
Stack p;
Stack *s;
s=&p;
// struct stack s;
//初始化栈
printf("\n###########初始化栈###########\n");
init(s);
printf("----------------------------------");
//入栈操作
printf("\n###########入栈操作###########\n");
for(i=0;i<=10;i++)
{
Push(s,i);
}
printf("----------------------------------");
//取栈顶元素
printf("\n###########取栈顶元素###########\n");
printf("%d\n",Top(s));
printf("----------------------------------");
//出栈操作
printf("\n###########出栈操作###########\n");
for(i=0;i<=12;i++)
{
Pop(s);
}
printf("----------------------------------");
//取栈顶元素
printf("\n###########取栈顶元素###########\n");
Top(s);
printf("----------------------------------");
//销毁栈
printf("\n###########销毁栈###########\n");
Push(s,10);
Destroy(s);
Top(s);
}
这样就可以实现无限大小的栈了,这里realloc之后的指针,在free的时候容易出错