C语言实现栈(基于数组)
来源:互联网 发布:betterzip mac版 编辑:程序博客网 时间:2024/06/15 02:19
栈是一种操作受限的数据结构,只允许从一段操作,而且先进后出(FILO first in last out)这里将栈的操作封装在C语言的头文件里
实现栈的代码如下
- #include<stdbool.h>
- #define maxsize 10
- typedef int datatype;
-
-
- 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;
-
-
- 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;
-
-
- struct stack
- {
- datatype data[maxsize];
- int top;
- };
-
- typedef struct stack Stack;
-
-
-
-
- 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;
-
-
- 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;
-
-
- struct stack
- {
- datatype *data;
- int top;
- };
-
- typedef struct stack Stack;
-
-
- int realsize=maxsize;
-
-
-
- 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);
- }
- }
-
-
- 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;
-
- }
测试栈的代码
- #include<stdio.h>
- #include "DynamicStack1.0.h"
- int main()
- {
- int i=0;
- Stack p;
- Stack *s;
- s=&p;
-
-
- 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的时候容易出错