您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】 栈的基本操作

2014-04-25 22:50 363 查看
/*
===============================================================================================
栈的基本操作
By~fanxingzju			2014-04-14
1.构造一个空栈Stack
2.销毁栈Stack
3.把Stack置为空栈
4.若栈Stack为空栈,则返回true,否则返回false
5.用length返回栈中元素的个数,即栈的长度
6.若栈不为空,则用elem返回Stack的栈顶元素,并返回true,否则返回false
7.向栈顶压入值为elem为新元素
8.若栈不为空,则删除S的栈顶元素,用elem返回其值,并返回true,否则返回false

===============================================================================================
说明:
1.我在大部分函数前添加了 “if (NULL == Stack.base)”的条件判断,但正常使用时,这段代码不是必须的,可以删除
2.在Push操作时,对于栈满的情况,进行了追加内存的操作。为了保证堆栈的顺序,引入了中间堆栈tempStack
*/
#include <stdio.h>
#include <stdlib.h>

#define STACK_MAX_SIZE 10
#define STACK_INCREMENT 3
#define SElemType int

typedef struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;

//1.构造一个空栈Stack
bool InitStack(SqStack &Stack)
{
Stack.base = new SElemType[STACK_MAX_SIZE];
if (!Stack.base)
{
printf("InitStack()函数运行,内存分配失败\n");
system("pause");
exit(-1);
}
Stack.top = Stack.base;
Stack.stacksize = STACK_MAX_SIZE;
printf("InitStack()函数执行,空栈构造成功\n");
return true;
}

//2.销毁栈Stack
bool DestoyStack(SqStack &Stack)
{
Stack.top = Stack.base;
delete[] Stack.base;
Stack.base = NULL;
Stack.top = NULL;
printf("DestoryStack()函数执行,栈销毁成功\n");
return true;
}

//3.把Stack置为空栈
bool ClearStack(SqStack &Stack)
{
if (NULL == Stack.base)
{
printf("ClearStack()函数执行,栈不存在,无法清空\n");
return false;
}
Stack.top = Stack.base;
printf("ClearStack()函数执行,栈清空成功\n");
return true;
}

//4.若栈Stack为空栈,则返回true,否则返回false
bool StackEmpty(SqStack Stack)
{
if (NULL == Stack.base)
{
printf("StackEmpty()函数执行,栈不存在!!\n");
system("pause");
exit(-1);
}
if (Stack.top == Stack.base)
{
printf("StackEmpty()函数执行,栈为空栈\n");
return true;
}
printf("StackEmpty()函数执行,栈不为空\n");
return false;
}

//5.返回栈中元素的个数,即栈的长度
bool StackLength(SqStack Stack, int &length)
{
if (NULL == Stack.base)
{
printf("StackLength()函数执行,栈不存在,返回长度失败\n");
return false;
}
length = Stack.top - Stack.base;
printf("Stacklength()函数执行,栈的长度为 %d \n", length);
return true;
}

//6.若栈不为空,则用elem返回Stack的栈顶元素,并返回true,否则返回false
bool GetTopStack(SqStack Stack, SElemType &elem)
{
if (NULL == Stack.base)
{
printf("GetTop()函数执行,栈不存在,获取栈顶元素失败\n");
return false;
}
if (Stack.base == Stack.top)
{
printf("GetTop()函数执行,栈为空,获取栈顶元素失败\n");
return false;
}
elem = *(Stack.top - 1);
printf("GetTop()函数执行,栈顶元素为: %d \n", elem);
return true;
}

//7.7.向栈顶压入值为elem为新元素
bool PushStack(SqStack &Stack, SElemType elem)
{
if (NULL == Stack.base)
{
printf("PushStack()函数执行,栈不存在,向栈顶压入元素失败\n");
system("pause");
exit(-1);
}
if (Stack.top - Stack.base >= Stack.stacksize)
{
printf("PushStack()函数执行,原始栈已满,重新给栈分配更大的空间\n");
SqStack tempStack, newStack;
tempStack.base = new SElemType[Stack.stacksize];
newStack.base = new SElemType[Stack.stacksize + STACK_INCREMENT];
if ((!tempStack.base)||(!newStack.base))
{
printf("PushStack()函数运行,内存分配失败\n");
system("pause");
exit(-1);
}
tempStack.top = tempStack.base;
tempStack.stacksize = Stack.stacksize;
newStack.top = newStack.base;
newStack.stacksize = Stack.stacksize + STACK_INCREMENT;
while(Stack.top != Stack.base)
{
SElemType temp = *--Stack.top;
*tempStack.top++ = temp;
}
while(tempStack.top != tempStack.base)
{
SElemType temp = *--tempStack.top;
*newStack.top++ = temp;
}
delete[] Stack.base;
delete[] tempStack.base;
Stack = newStack;
}

*Stack.top++ = elem;
printf("PushStack()函数执行,元素 %d 压入栈顶成功\n", elem);
return true;
}

//8.若栈不为空,则删除S的栈顶元素,用elem返回其值,并返回true,否则返回false
bool PopStack(SqStack &Stack, SElemType &elem)
{
if (NULL == Stack.base)
{
printf("PopStack()函数执行,栈不存在,弹出栈顶元素失败\n");
system("pause");
exit(-1);
}
if (Stack.base == Stack.top)
{
printf("PopStack()函数执行,栈为空,弹出栈顶元素失败\n");
return false;
}
elem = *--Stack.top;
printf("PopStack()函数执行,弹出栈顶元素成功,栈顶的元素为: %d \n", elem);
return true;
}

int main()
{
SqStack Stack;
InitStack(Stack);

for (int i = 0; i != 30; ++i)
{
PushStack(Stack, i);
}
StackEmpty(Stack);

int length = 0;
StackLength(Stack, length);

SElemType elem;
GetTopStack(Stack, elem);

while(PopStack(Stack, elem))
{
//printf("PopStack()函数执行,弹出栈顶元素成功,栈顶的元素为: %d \n", elem);
}

ClearStack(Stack);
DestoyStack(Stack);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: