您的位置:首页 > 其它

栈的链表和数组实现

2014-07-06 16:43 204 查看
栈的链表实现

LinkStack.h

#ifndef LINKSTACK_H_
#define LINKSTACK_H_

typedef int DataType;               //自定义数据类型,假定为整型

struct Node;                        //单链表结点类型
typedef struct Node *PNode;         //结点指针类型

typedef struct Node                 //单链表结点结构
{
DataType info;                  //结点数据域
PNode link;                     //结点指针域
}Node;

typedef struct LinkStack           //链表栈定义
{
PNode top;        //栈顶指针
}LinkStack;

typedef struct LinkStack * PLinkStack;    //链表栈的指针类型

//创建一个空栈
PLinkStack createEmptyStack( void );

//判断栈是否为空栈
int isEmptyStack(PLinkStack stack);

//进栈,成功返回1,失败返回0
int push(PLinkStack stack,DataType x);

//出栈,成功返回1,失败返回0
int pop(PLinkStack stack);

//取栈顶元素
DataType getTop(PLinkStack stack);

//显示栈内所有元素
void showStack(PLinkStack stack);

//把栈置空
void setEmpty(PLinkStack stack);

//把栈销毁
void destroyStack(PLinkStack stack);

#endif /* LINKSTACK_H_ */


LinkStack.c

#include <stdio.h>
#include <malloc.h>
#include "LinkStack.h"

//创建一个的空栈
PLinkStack createEmptyStack(void)
{
PLinkStack stack=(PLinkStack)malloc(sizeof(struct LinkStack));
if(stack == NULL)
printf("存储分配失败,请重建栈!\n");
else
stack->top=NULL;
return stack;
}

//判断栈是否为空栈
int isEmptyStack(PLinkStack stack)
{
return (stack->top == NULL);
}

//进栈,成功返回1,失败返回0
int push(PLinkStack stack,DataType x)
{
PNode p =(PNode)malloc(sizeof(struct Node));
if(p == NULL )
{
printf("新结点分配内存失败,进栈失败,请重试!\n");
return 0;
}
else
{
p->info = x;
p->link=stack->top;     //替换栈顶元素
stack->top=p;
return 1;
}
}

//出栈,成功返回1,失败返回0
int pop(PLinkStack stack)
{
if(isEmptyStack(stack))
{
printf("栈为空!\n");
return 0;
}
else
{
PNode p;
p=stack->top;   //删除最后一个结点
stack->top = stack->top->link;
free(p);
return 1;
}
}

//取栈顶元素
DataType getTop(PLinkStack stack)
{
if(isEmptyStack(stack))
{
printf("栈为空!取栈顶元素失败!\n");
return NULL;
}
return (stack->top->info);
}

//显示栈内所有元素
void showStack(PLinkStack stack)
{
if(isEmptyStack(stack))
printf("当前栈为空!无内容可显示。\n");
else
{
PNode p;
p=stack->top;
printf("顶--> ");
while(p->link != NULL)
{
printf("%d ",p->info);
p=p->link;
}
printf("%d ",p->info);  //显示最后一个元素
printf("-->底\n");
}
}

//把栈置空
void setEmpty(PLinkStack stack)
{
stack->top=NULL;
}

//把栈销毁
void destroyStack(PLinkStack stack)
{
if(stack)
{
stack->top=NULL;
free(stack);
}
}


LinkStackMain.c

#include <stdio.h>
#include "LinkStack.h"

int main() {
PLinkStack stack;
int i;
stack = createEmptyStack();
printf("0-9依次入栈并输出如下:\n");
for (i = 0; i < 10; i++) {
push(stack, i);
}
showStack(stack);
printf("栈中元素依次出栈并输出如下:\n");
for (i = 0; i < 10; i++) {
pop(stack);
}

destroyStack(stack);
printf("栈已被销毁\n");

return 0;
}


栈的数组实现

#include <stdio.h>
#include <malloc.h>

#define STACK_SIZE 50

typedef struct SeqStack
{
int data[STACK_SIZE];
int top;
}stack;

void InitStack(stack * s)
{
s->top = -1;
}

int IsFull(stack *s)
{
return (s->top == STACK_SIZE - 1);
}

int IsEmpty(stack *s){
return (s->top == -1);
}

void Push(stack *s,int n)
{
if(IsFull(s))
{
printf("Stack is full!\n");
return;
}
s->top++;
s->data[s->top] = n;
}

int Pop(stack *s)
{
if(IsEmpty(s))
{
printf("Stack is empty!\n");
return -1;
}
return s->data[s->top--];
}

int  main()
{
stack *s = (stack *)malloc(sizeof(stack));
if(s == NULL)
{
printf("Malloc failed!");
exit(0);
}

InitStack(s);

int i;
for(i=0;i<10;i++)
{
Push(s,i);
}

while(!IsEmpty(s))
{
int data = Pop(s);
printf("%d->",data);
}

return 0;
}


栈的数组实现 固定了数组大小,链表实现动态生成空间,都可以实现栈的数据结构特点。

最基础的数据结构:数组和链表,其他复杂数据结构都可以在这两种基础数据结构基础上构建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐