栈是数据结构中十分重要的一部分内容,关于栈的应用也十分的广泛,下面是顺序栈的实现,分别用了两种不同的方式,大致都是运用数组这一种线性的结构。
栈的抽象数据类型:
ADT 栈(Stack)
Data:
1.相同的类型2.相邻元素前驱后继的关系
Operation操作
InitStack(*s);初始化
DestoryStack(*s):销毁栈
ClearStack(*s):清空操作
StackEmpty(s):判断栈为空
GetTop(s):获取栈顶元素
Push(*s,e):压入一个元素到栈中
Pop(*s,*e):弹出栈中元素
StackLength(s):获取栈中元素的个数
第一种:
// MyStack.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; //定义的一些名称 #define COUNT 50 #define ERROR 0 #define OK 1 typedef int ElemType; typedef int Status; //栈的数据定义 typedef struct { ElemType data[COUNT]; int top; }LineStack,*PointStack; //栈的初始化 Status InitStack(PointStack s) { if (!s) { return ERROR; } for (int i = 0; i < COUNT; i++) { s->data[i] = 0; } s->top = 0; return OK; } //栈的压入操作 Status Push(PointStack s, ElemType e) { if (s->top == COUNT) { return ERROR; } s->data[s->top] = e; s->top++; return OK; } //栈的弹出操作 Status Pop(PointStack s, ElemType *e) { if (s->top==0) { return ERROR; } s->top--; *e = s->data[s->top]; s->data[s->top] = 0; return OK; } //栈的长度 int StackLength(LineStack s) { if (&s) { return s.top; } return -1; } //判断栈是否为空 Status StackEmpty(LineStack s) { if(s.top==0) { return OK; } return ERROR; } //清空栈 Status ClearStack(PointStack s) { while (s->top!=0) { s->top--; s->data[s->top] = 0; } return OK; } //删除栈 //Status DestroyStack(PointStack s) //{ // if (s) // { // free(s); // return OK; // } // return ERROR; //} //获取栈顶元素 Status GetTop(LineStack s,ElemType *e) { if (s.top != 0) { *e=s.data[s.top-1]; return OK; } return ERROR; } int main() { cout << "***********一个简单的线性栈的实现*****************" << endl; //声明并初始化一个栈 int status;//用来保存Status的值 LineStack s;//系统已经为s分配了一个内存空间 //初始化s, status=InitStack(&s); cout << "初始化是否成功:" << status << endl; //判断s是否为空 status=StackEmpty(s); cout << "判断栈是否为空:" << status << endl; //压入元素到栈中 status = Push(&s, 1); cout << "压入一个元素是否成功:" << status << endl; //压入元素到栈中 status = Push(&s, 2); cout << "压入一个元素是否成功:" << status << endl; //压入元素到栈中 status = Push(&s, 3); cout << "压入一个元素是否成功:" << status << endl; //压入元素到栈中 status = Push(&s, 4); cout << "压入一个元素是否成功:" << status << endl; //压入元素到栈中 status = Push(&s, 5); cout << "压入一个元素是否成功:" << status << endl; //取栈顶的元素 ElemType a; status= GetTop(s, &a); cout << "取栈顶元素是否成功:" << status << " 栈顶的元素为:" << a << endl; //弹出栈顶元素 ElemType b; status = Pop(&s, &b); cout << "弹出栈顶元素是否成功:" << status << " 弹出的元素为:" << b << endl; //取栈顶的元素 ElemType c; status = GetTop(s, &c); cout << "取栈顶元素是否成功:" << status << " 栈顶的元素为:" << c << endl; //获取栈的长度 int length = StackLength(s); cout << "栈的长度为:" << length << endl; //清空栈 status = ClearStack(&s); cout << "清空栈中的元素是否成功:" << status << endl; //取栈顶的元素 ElemType d; status = GetTop(s, &d); cout << "取栈顶元素是否成功:" << status << " 栈顶的元素为:" << d<< endl; ////销毁栈 //status = DestroyStack(&s); cin.get(); return 0; }
执行结果:
第二种:
/***顺序栈的实现***/ #include "stdafx.h" #include<iostream> #include<stdlib.h> using namespace std; //顺序栈定义 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef int Status; typedef int SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; //算法3.1 顺序栈的初始化 Status InitStack(SqStack &S) {// 构造一个空栈 S S.base = new SElemType[MAXSIZE]; //为顺序栈分配一个最大容量为MAXSIZE的数组空间 if (!S.base) exit(OVERFLOW); //存储分配失败 S.top = S.base; S.stacksize = MAXSIZE; return OK; } //算法3.2 顺序栈的入栈 Status Push(SqStack &S, SElemType &e) { // 插入元素e为新的栈顶元素 if (S.top - S.base == S.stacksize) return ERROR; //栈满 *(S.top++) = e; //元素e压入栈顶,栈顶指针加1 return OK; } //算法3.3 顺序栈的出栈 Status Pop(SqStack &S, SElemType &e) {// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if (S.base == S.top) return ERROR;//栈空 e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e return OK; } //算法3.4 取顺序栈的栈顶元素 Status GetTop(SqStack S, SElemType &e) {// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if (S.top == S.base) return ERROR; e = *(S.top - 1);//栈顶指针减1,将栈顶元素赋给e return OK; } int main() { SqStack s; SElemType e; SElemType t; cout << "进栈元素依次为:" << endl; if (InitStack(s) == OK) for (int j = 1; j <= 12; j++) { Push(s, j); cout << j << " "; } cout << endl << "依次弹出的栈顶元素为:" << endl; while (GetTop(s, e) == OK) { cout << e << " "; Pop(s, t); } cin.get(); return 0; }
执行结果:
以上还有一个没有问题没有太懂,第一种实现方式中的DestoryStack(*s),用free()释放内存存在问题,网上查了说free()和delete()释放内存是存在差别的,大致是讲new和delete是成对使用的,而free是和malloc使用的,由于水平有限,后续会完善补上;同时希望知道的小伙伴能在下方留言,十分感谢!