// stack.cpp: implementation of the stack class.
//
//////////////////////////////////////////////////////////////////////
#include "stack.h"
#include <iostream>
#include <malloc.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
stack* g_pStack = NULL;
stack::stack()//构造函数
{
InitStack();
}
stack::~stack()//析构函数
{
DestroyStack(); //销毁链栈
}
///@brief 函数名: mainface()
///@brief 函数功能:系统主界面
///@date 2011-4-12
///@param [IN]
///@retval
///@return
///@note 备注:
void mainface()//系统主界面
{
printf( "\n");
printf( "\n");
printf( "\n");
printf( "\n");
printf( " ****************************************************");
printf( "\n");
printf( " WELCOME TO THE CODE ZOON OF STACK ");
printf( "\n");
printf( " 欢迎来到栈的园地 ");
printf( "\n");
printf( " ****************************************************");
printf( "\n");
printf( "\n");
}
///@brief 函数名: mainmenu()
///@brief 函数功能:系统管理界面
///@date 2011/4/12--2011/4/14
///@param [IN]
///@retval
///@return
///@note 备注:
void mainmenu()//系统管理界面
{
char ch;
char yes_no;
system("cls"); //调用清屏函数。
do
{
printf ( "\n");
printf ( "\n");
printf ( "\n");
printf ( "\n");
printf ( "\n");
printf ( "**************************************************************\n");
printf ( "* 请输入选项编号(A-J): *\n");
printf ( "**************************************************************\n");
printf ( "* A、构造空栈 *\n");
printf ( "* B、销毁栈 *\n");
printf ( "* C 清除栈 *\n");
printf ( "* D、判断栈是否为空 *\n");
printf ( "* E、求栈长度 *\n");
printf ( "* F、返回栈顶元素 *\n");
printf ( "* G 插入栈顶元素 *\n");
printf ( "* H、弹出删除栈顶元素 *\n");
printf ( "* I、遍历打印栈元素 *\n");
printf ( "* J、退出 *\n");
printf ( "**************************************************************\n");
printf ( "请输入你的选择:\n");
//getchar();
scanf("%c",&ch);
ElemType e;
switch (ch)
{
case'A':
//如果以前的栈没有销毁,则先销毁,或者提示他先销毁。
if ( g_pStack != NULL )
{
free(g_pStack);//销毁栈
g_pStack = NULL;
}
g_pStack = new stack;//初始化栈
break;
case 'B':
if ( g_pStack != NULL )
{
free(g_pStack);//销毁栈
g_pStack = NULL;
}
else
{
HintCreatStack();
}
break;
case 'C':
if ( g_pStack == NULL )
{
HintCreatStack();
}
else
{
g_pStack->ClearStack (); //清除栈
}
break;
case 'D':
if ( g_pStack == NULL )
{
HintCreatStack();
}
else
{
if ( g_pStack->StackEmpty () )//判断栈是否为空
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
break;
case 'E':
if ( g_pStack == NULL )
{
HintCreatStack();
}
else
{
printf( "%d\n", g_pStack->StackLength () );//求栈长度
}
break;
case 'F':
if ( g_pStack == NULL )
{
HintCreatStack();
}
else
{
if ( g_pStack->GetTop ( e ) ) //取栈顶元素
{
printf( "%d\n", e );
}
else
{
printf("空栈!\n");
}
}
break;
case 'G':
if ( g_pStack == NULL )
{
HintCreatStack();
}
else
{
printf( "请输入要插入的整数:\n");
scanf("%d",&e);
g_pStack->Push ( e );//进栈。 插入栈顶元素:进栈,将元素e插入到栈中作为栈顶元素
}
break;
case 'H':
if ( g_pStack == NULL )
{
HintCreatStack();
}
else
{
if ( g_pStack->Pop ( e ) )//出栈。 返回栈顶元素:出栈,从栈中退出栈顶元素,并将其值赋给e
{
printf( "%d\n", e );
}
else
{
printf("空栈!\n");
}
}
break;
case 'I':
if ( g_pStack == NULL )
{
HintCreatStack();
}
else
{
g_pStack->DispStack();//遍历打印栈元素
}
break;
case 'J':
exit (0);
break;
default:
{
printf("输入错误,请重新输入\n");
mainmenu();
}
}
printf( "\n 要继续选择吗(Y/N)?\n");
do
{
scanf("%c",&yes_no);//yes_no = getchar();
} while ( yes_no != 'Y' && yes_no != 'y' && yes_no != 'N' && yes_no != 'n') ;
if ( yes_no == 'N' || yes_no == 'n' )
{
break;
}
} while ( yes_no == 'y' || yes_no == 'Y' );
}
///@brief 函数名: InitStack()
///@brief 函数功能:栈的初始化
///@date 2011/4/15
///@param [IN]
///@retval
///@return
///@note 备注:
void stack::InitStack() //栈的初始化
{
m_pHeadNode = ( NodeType * )malloc( sizeof ( stack ));//为头结点申请空间
m_pHeadNode ->next = NULL;
system("cls"); //调用清屏函数。
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("******************************************************");
printf("\n");
printf(" 完成栈的初始化!! ");
printf("\n");
printf("******************************************************\n");
printf("\n");
}
///@brief 函数名: DestroyStack()
///@brief 函数功能:栈的销毁
///@date 2011/4/16
///@param [IN]
///@retval
///@return
///@note 备注:
void stack::DestroyStack()//销毁栈
{
NodeType *p = m_pHeadNode, *q = NULL;
while ( p != NULL )
{
q = p;
p = p->next;
free( q );
};
m_pHeadNode = NULL;
system("cls"); //调用清屏函数。
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("******************************************************");
printf("\n");
printf(" 完成栈的销毁!! ");
printf("\n");
printf("******************************************************");
printf("\n");
}
///@brief 函数名: ClearStack ()
///@brief 函数功能:栈的清除
///@date 2011/4/17
///@param [IN]
///@retval
///@return
///@note 备注:
int stack::ClearStack () //清除栈
{
NodeType *p = m_pHeadNode ->next,*q = NULL;
while ( p != NULL )
{
q = p;
p = p->next;
free( q );
}
m_pHeadNode->next = NULL;
system("cls"); //调用清屏函数。
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("******************************************************");
printf("\n");
printf(" 完成栈的清除!! ");
printf("\n");
printf("******************************************************");
printf("\n");
return 1;
}
///@brief 函数名: StackLength ()
///@brief 函数功能:求栈的长度
///@date 2011/4/18
///@param [IN]
///@retval
///@return
///@note 备注:
int stack::StackLength ()//求栈长度
{
int i = 0;
NodeType *p;
p = m_pHeadNode ->next;
while( p != NULL )
{
i++;
p = p->next;
}
return i;
}
///@brief 函数名: StackEmpty ()
///@brief 函数功能:判断栈是否为空
///@date 2011/4/19
///@param [IN]
///@retval
///@return
///@note 备注:
int stack::StackEmpty ()//判断栈是否为空
{
return ( m_pHeadNode ->next == NULL );
}
///@brief 函数名: Push ( ElemType e )
///@brief 函数功能:插入栈顶元素:进栈,将元素e插入到栈中作为栈顶元素
///@date 2011/4/20
///@param [IN]
///@retval
//