1. 程式人生 > >棧ADT鏈式實現及陣列實現

棧ADT鏈式實現及陣列實現

棧ADT  棧的名詞就不解釋了

先是鏈式實現:

三個程式碼  測試 標頭檔案 及函式實現原始碼

stack.h:

/*  棧型別的標頭檔案  */    
  
  
#ifndef STACK_H_  
#define STACK_H_   
  
  
struct Node;                                    //先宣告,就可以在下面使用,而不必因定義在後面而產生衝突  
  
   
/*  一般型別定義  */    
typedef int ElementType;                        //抽象資料型別    
typedef struct Node * PtrToNode;  
typedef PtrToNode Stack;  

  
  
/*  特定於程式的宣告  */     
struct Node {  
    ElementType element;    
    PtrToNode	next;  
};  
  
  
/*  函式原型  */    
void MakeEmpty ( Stack s );  
int IsEmpty ( Stack s );
void Push ( ElementType x, Stack s );  
void Pop ( Stack s );  
Stack CreateStack ( void );
void DisposeStack ( Stack s );
ElementType Top ( Stack s );
  
 
#endif  

stack.c:
/*  list.c  -- 支援棧操作的函式  */    
  
  
#include <stdio.h>    
#include <stdlib.h>  
#include "stack.h"    
  
  
/*  介面函式  */    
  
  
/*  把棧初始化為空棧  */  
void MakeEmpty ( Stack s )
{  
	if ( NULL == s )
	{
		printf ( "必須首先建立一個棧!\n" );
	}
	else
	{
		while ( !IsEmpty ( s ) )
		{
			Pop ( s );
		}
	}
}  
  
/*  檢查棧是否為空  */    
int IsEmpty ( Stack s )    
{    
    return ( NULL == s -> next );  
}    
   
/*  建立一個棧  */
Stack CreateStack ( void )
{
	Stack s;

	s = ( Stack )malloc ( sizeof ( struct Node ) );

	if ( NULL == s )
	{
		printf ( "建立失敗!\n" );

		return NULL;
	}
	else
	{
		s -> next = NULL;

		MakeEmpty ( s );

		return s;
	}
}

/*  棧頂插入元素x  */
void Push ( ElementType x, Stack s )
{
	PtrToNode tmp;								//此處為了清楚起見,別用 Stack.

	tmp = ( Stack )malloc ( sizeof ( struct Node ) );

	if ( NULL == tmp )
	{
		printf ( "插入失敗!\n" );
	}
	else
	{
		tmp -> element = x;						//別忘了賦值這一步.
		tmp -> next = s -> next;
		s -> next = tmp;
	}
}
		
/*  棧頂彈出元素  */
void Pop ( Stack s )
{
	if ( IsEmpty ( s ) )
	{
		;
	}
	else
	{
		PtrToNode tmp;

		tmp = s -> next;
		s -> next = s -> next -> next;

		free ( tmp );
	}
}

/*  返回棧頂元素  */
ElementType Top ( Stack s )
{
	if ( IsEmpty ( s ) )
	{
		return 0;								//棧為空,返回0,代表錯誤!
	}
	else
	{
		return ( s -> next -> element );
	}
}

/*  銷燬棧  */
void DisposeStack ( Stack s )
{
	PtrToNode tmp;
	PtrToNode p;

	p = s -> next;

	free ( s );
	s = NULL;									//想想實參形參,外面s的值不會因為這裡而改變.
	
	//while ( NULL != p -> next )
	//{
	//	tmp = p -> next;
	//	free ( p );
	//	p = tmp;
	//}

	//free ( p );

	while ( NULL != p )
	{
		tmp = p -> next;
		free ( p );
		p = tmp;
	}
}

test.c:
#include "stack.h"
#include <windows.h>
#include <stdio.h>

int main ( void )
{

	Stack s = CreateStack ( );					//測試CreateStack ( )函式

	printf ( "%d\n", ( IsEmpty ( s ) ) );		//測試IsEmpty ( s )函式
	
	Push ( 1, s );
	Push ( 2, s );

	printf ( "%d\n", ( Top ( s ) ) );

	Pop ( s );

	printf ( "%d\n", ( Top ( s ) ) );

	printf ( "%d\n", ( IsEmpty ( s ) ) );

	MakeEmpty ( s );

	printf ( "%d\n", ( IsEmpty ( s ) ) );

	DisposeStack ( s );

	system ( "pause" );

	return 0;

}