Algorithms: 栈(Stack) 链式与数组实现

           专栏申请成功了,挺高兴的,以后好好努力,将自己的数据结构与算法学习之路雕刻与此!

 

/*---------------------------------------------------------------------------------
 * Project: Stack.h
 * Name: zwp
 * Date: 2014/3
 *---------------------------------------------------------------------------------*/



#ifndef STACK_H_
#define STACK_H_

struct Node;
typedef struct Node *Stack;

typedef int ElementType;

/*
** 判断空
*/
int IsEmpty(Stack S);

/*
** 创建栈
*/
Stack CreateStack(void);


/*
** 创建空栈
*/
void MakeEmpty(Stack S);

/*
** 入栈
*/
void Push(ElementType X, Stack S);

/*
** 出栈
*/
ElementType Top(Stack S);

/*
** 销毁栈顶元素
*/
void Pop(Stack S);




#endif


 

/*-------------------------------------------------------------------------
 * Project: Stack.cpp
 * Name: zwp
 * Date: 2014/3
 *-------------------------------------------------------------------------*/



#include "Stack.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


struct Node
{
	ElementType Element;
	Stack Next;
};


/*
** 判断栈是否为空
*/
int IsEmpty(Stack S)
{
	return S->Next == NULL;
}


/*
** 创建栈
*/
Stack CreateStack(void)
{
	Stack S;

	S = (Stack)malloc(sizeof(struct Node));
	if(S == NULL)
		printf("Out of space...\n");

	S->Next = NULL;
	MakeEmpty(S);

	return S;
}


/*
** 创建空栈
*/
void MakeEmpty(Stack S)
{
	if(S == NULL)
		printf("Must use Create Stack....\n");
	else
		while(!IsEmpty(S))
			Pop(S);
}


/*
** 入栈
*/
void Push(ElementType X, Stack S)
{
	Stack TmpCell;

	TmpCell = (Node*)malloc(sizeof(Node));
	if(TmpCell == NULL)
		printf("Out of space....\n");
	else
	{
		TmpCell->Element = X;
		TmpCell->Next = S->Next;
		S->Next = TmpCell;
	}
}


/*
** 弹栈
*/
ElementType Top(Stack S)
{
	if(!IsEmpty(S))
		return S->Next->Element;

	printf("Empty Stack.....\n");
	return NULL;

}


/*
** 删除栈顶元素
*/
void Pop(Stack S)
{
	Stack FirstCell;

	if(IsEmpty(S))
		printf("Empty Stack...\n");
	else
	{
		FirstCell = S->Next;
		S->Next = S->Next->Next;
		free(FirstCell);
	}
}





 

/*-------------------------------------------------------------------------------
 * Project: Main.cpp
 * Name: zwp
 * Date: 2014/3
 *-------------------------------------------------------------------------------*/



#include "Stack.h"
#include <stdio.h>
#include <stdlib.h>



int main(int argc, char* argv[])
{
	int i = 0;
	Stack s = CreateStack();

	for(i = 0; i < 100; ++ i)
		Push(i+1, s);

	
	for(i = 0; i < 100; ++ i)
	{
		printf("%d \n", Top(s));
		Pop(s);
	}
	

	
	system("pause");
	return 0;
}


 

下面是数组实现:

 

/*-----------------------------------------------------------------------------
 * Project: Stack.h
 * Name: zwp
 * Date: 2014/4
 *------------------------------------------------------------------------------*/


#ifndef STACK_H_
#define STACK_H_

typedef int ElementType;

typedef struct Node
{
	int Capacity;
	int Top;
	ElementType *Array;

}*Stack;




/*
** Initialize
*/
Stack CreateStack(int MaxElement);


/*
** DisposeStack
*/
void DisposeStack(Stack S);


/*
** IsEmpty
*/
int IsEmpty(Stack S);


/*
** MakeEmpty
*/
void MakeEmpty(Stack S);


/*
** Push
*/
void Push(ElementType X, Stack S);


/*
** Pop
*/
void Pop(Stack S);


/*
** Top
*/
ElementType Top(Stack S);


/*
** IsFull
*/
int IsFull(Stack S);



#endif




 

/*-----------------------------------------------------------------------------------
 * Project: Stack.cpp
 * Name: zwp
 * Date: 2014/4
 *-----------------------------------------------------------------------------------*/



#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "Stack.h"



/*
** Initialize
*/
Stack CreateStack(int MaxElement)
{
	Stack S;

	S = (Stack)malloc(sizeof(struct Node));
	if(S == NULL)
		printf("Out of space....\n");

	S->Array = (ElementType*)malloc(sizeof(ElementType) * 100);
	if(S->Array == NULL)
		printf("Out of space...\n");

	S->Capacity = 100;
	MakeEmpty(S);


	return S;

}



/*
** DisposeStack
*/
void DisposeStack(Stack S)
{
	if(S != NULL)
	{
		free(S->Array);
		free(S);
	}
}



/*
** IsEmpty
*/
int IsEmpty(Stack S)
{
	return S->Array ? 0 : 1;
}


/*
** MakeEmpty
*/
void MakeEmpty(Stack S)
{
	S->Top = 0;
}

/*
** Push
*/
void Push(ElementType X, Stack S)
{
	if(IsFull(S))
		printf("Full stack....\n");
	else
		S->Array[++S->Top] = X;

}

/*
** Pop
*/
void Pop(Stack S)
{
	if(IsEmpty(S))
		printf("Empty stack....\n");
	else
		 S->Top--;
}


/*
** Top
*/
ElementType Top(Stack S)
{
	if(!IsEmpty(S))
		return S->Array[S->Top];

	printf("Empty Stack....\n");
	return 0;
}


/*
** IsFull
*/
int IsFull(Stack S)
{
	return (S->Top == 100) ? true : false;

}

/*-------------------------------------------------------------------------------
 * Project: Main.cpp
 * Name: zwp
 * Date: 2014/4
 *--------------------------------------------------------------------------------*/



#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"


int main(int argc, char* argv[])
{
	Stack S = CreateStack(100);

	for(int index = 0; index < 100; ++ index)
		Push(index, S);

	printf("\n\n");

	for(int index = 0; index < 100; ++ index)
	{
		printf("%d \n", Top(S));
		Pop(S);

	}



	system("pause");



}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值