目录
-
栈
FILO,即先进后出,类似我们去取一摞碗,我们是不是从最上面的那个碗开始取,而我们用完洗净后放回去的第一个碗被最后拿了出来,但是最后放进去的被最先拿了出来。
-
顺序存储
顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。
优点:随机存取表中元素、储存密度大。
缺点:插入和删除操作需要移动元素。
-
定义基本数据结构
typedef char ElemetType; //这里的char的数据类型可以根据自己需要设置 const int Max_dataSize = 512; //定义数组的大小,用define也可以,但在c++中不提倡这么写 typedef struct Dstack //定义栈的结构体 { ElemetType Data[Max_dataSize]; int top; }st_stack;
-
初始化
void Init(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } s_ptr->top = -1; //栈空,top = -1 }
-
入栈
void Push(st_stack* s_ptr, ElemetType data) { if (NULL == s_ptr) { exit(0); } if (Max_dataSize == s_ptr->top) //判栈是否满 { cout << "栈满" << endl; exit(0); } s_ptr->Data[++(s_ptr->top)] = data; //依次入栈 }
-
出栈
void Pop(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } if (-1 == s_ptr->top) //判空 { cout << "栈空" << endl; exit(0); } while (s_ptr->top != -1) { cout << s_ptr->Data[(s_ptr->top)--] << endl; //栈的输出元素 } }
-
判栈是否为空
bool IsEmpty(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } if (-1 == s_ptr->top) //判空 { return true; } else return false; }
-
把栈置空
bool SetEmpty(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } while (s_ptr->top != -1) { if (-1 == s_ptr->top) { cout << "栈空" << endl; } s_ptr->Data[s_ptr->top] = -1; s_ptr->top--; } if (-1 == s_ptr->top) { return true; } else return false; }
-
获取栈顶元素
ElemetType GetTop(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } return s_ptr->Data[s_ptr->top]; }
-
头文件
#ifndef __SATCK_H__ //防止头文件重复包含 #include <iostream> #include <string> using namespace std; typedef char ElemetType; const int Max_dataSize = 512; typedef struct Dstack { ElemetType Data[Max_dataSize]; int top; }st_stack; void Init(st_stack* s_ptr); void Push(st_stack* s_ptr, ElemetType data); void Pop(st_stack* s_ptr); ElemetType GetTop(st_stack* s_ptr); bool SetEmpty(st_stack* s_ptr); #endif // !__SATCK_H__
-
源文件
#include "stack.h" void Init(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } s_ptr->top = -1; } bool IsEmpty(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } if (-1 == s_ptr->top) { return true; } else return false; } void Push(st_stack* s_ptr, ElemetType data) { if (NULL == s_ptr) { exit(0); } if (Max_dataSize == s_ptr->top) { cout << "栈满" << endl; exit(0); } s_ptr->Data[++(s_ptr->top)] = data; } void Pop(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } if (-1 == s_ptr->top) { cout << "栈空" << endl; exit(0); } while (s_ptr->top != -1) { cout << s_ptr->Data[(s_ptr->top)--] << endl; } } ElemetType GetTop(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } return s_ptr->Data[s_ptr->top]; } bool SetEmpty(st_stack* s_ptr) { if (NULL == s_ptr) { exit(0); } while (s_ptr->top != -1) { if (-1 == s_ptr->top) { cout << "栈空" << endl; } s_ptr->Data[s_ptr->top] = -1; s_ptr->top--; } if (-1 == s_ptr->top) { return true; } else return false; } void test() { ElemetType val = -1; st_stack* arr = new st_stack; Init(arr); if (IsEmpty(arr)) { cout << "栈空" << endl; } else { cout << "栈不为空" << endl; } Push(arr, 'A'); Push(arr, 'B'); Push(arr, 'C'); Push(arr, 'D'); if (IsEmpty(arr)) { cout << "栈空" << endl; } else cout << "栈不为空" << endl; val = GetTop(arr); cout << "栈顶元素为:" << val << endl; Pop(arr); if (SetEmpty(arr)) { cout << "置空成功" << endl; } else cout << "置空失败" << endl; if (IsEmpty(arr)) { cout << "栈空" << endl; } else cout << "栈不为空" << endl; } int main(int argc, char** argv) { test(); system("pause"); return 0; }
-
运行结果
-
运行结果分析
- 第一次判断为空,只是初始化为push;
- push之后栈不为空;(入栈顺序ABCD)
- 获取栈顶元素;
- 出栈;
- 把栈置空;
- 判断栈是否为空。
注:如有不足及需要改进的地方,敬请指正,谢谢!