【数据结构】 栈的基本操作
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; }
相关文章推荐
- 数据结构《16》----自动补齐实现《一》----Trie 树
- 数据结构《16》----自动补齐实现《一》----Trie 树
- 线性表(二)
- 《算法与数据结构》实验课实验三思考题——有序链表插入元素——C语言
- redis 存储数据结构
- 数据结构之排序
- 链表的基本操作
- 2013级数据结构第三次上机解题报告
- 迷宫问题递归与非递归求解
- 线性表(一)
- 《数据结构教程》(李春葆 主编)课后习题【练习题5】
- redis的源码分析之不同编码类型的数据结构
- 数据结构--栈(基础知识)
- (三)数据结构
- 数据结构 - 快速排序(Quick Sort) 详解 及 代码(C++)
- javascript实现数据结构:串--堆分配存储表示
- javascript实现数据结构:串--定长顺序存储表示以及kmp算法实现
- HDOJ 1075 What Are You Talking About
- 数据结构——树的集合
- Nginx学习(3)—封装的数据结构