// DataStructure_ZJC.cpp : 定义控制台应用程序的入口点。
/*
一. 栈学习
*/
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType; //元素类型
typedef int Status; //函数返回值
#define STACK_INIT_SIZE 100 // 栈的初始大小
#define STACK_INCREMENT 10 // 每次增加的空间大小
typedef struct
{
ElemType *base; //在构造栈之前和销毁之后,base的值为NULL
ElemType *top; //栈顶指针
ElemType stacksize; //当前已分配的存储空间,以元素为单位
}ZJC_Stack;
//---------------------------------------------栈基本操作的算法部分-------------------------------------------
//栈的初始化
Status InitStack(ZJC_Stack &S)
{
//构造一个空栈
S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //分配内存空间
if(!S.base) //分配失败则退出
exit(OVERFLOW);
//否则分配成功
else
{
S.top = S.base; //栈顶指针指向...
S.stacksize = STACK_INIT_SIZE; //指定栈的当前大小
return OK;
}
}
//获得栈顶元素
Status GetTop(ZJC_Stack S,ElemType &e)
{
if(S.top == S.base )
return ERROR;
e = *(S.top - 1);
return OK;
}
//压栈
Status Push(ZJC_Stack &S,ElemType e)
{
//插入元素e为栈顶元素
if(S.top - S.base >= S.stacksize) //表示栈满了,需要追加存储空间
{
S.base = (ElemType*)realloc(S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType));
if(!S.base)
exit(OVERFLOW);
S.stacksize += STACK_INCREMENT; ///
S.top = S.base + S.stacksize;
}
*S.top++ = e;
return OK;
}
void Print_Stack(ZJC_Stack S) //打印出栈中的元素
{
ElemType *p = S.base; //首先p指向栈底指针
printf("\n 打印出栈中的所有元素:...\n");
while( p != S.top) //只要没有到顶端,指针就移动,然后输出元素值
{
printf("栈中的元素:%d\n",*p);
p++;
}
}
//出栈函数
Status Pop(ZJC_Stack &S,ElemType &e)
{
if(S.top == S.base ) //空栈,返回错误
return ERROR;
else //不是空栈
{
e = * --S.top;
return OK;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("栈学习,测试....");
ZJC_Stack test_stack;
int e;
int i;
if(InitStack(test_stack))//初始化栈,如果初始化成功,则压入元素,然后输出值,然后出栈
{
for( i = 0;i < 10;i++)
Push(test_stack,i); //压入自然数 0~9
printf("\n压栈完成...");
Print_Stack(test_stack);//验证
//出栈...
printf("\n元素出栈...");
for( i = 0; i< 10; i++)
{
if(Pop(test_stack,e))
printf("\n%d",e);
}
}
return 0;
}
算法基础(一):栈
最新推荐文章于 2023-07-19 00:40:35 发布