#include<iostream>
#include<bits/stdc++.h>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 8
int a=0;
typedef struct
{
int *base;//栈底指针;
int *top;//栈顶指针;
int stacksize;//栈可用的最大容量;
}SqStack;
//顺序栈的初始化。
int InitStack(SqStack &S) //栈的初始化,构造一个空栈s。
{
cout<<"即将构造一个空的顺序栈!"<<endl;
//为顺序栈分配一个最大容量的空间;
S.base=new int[MAXSIZE];
//s.base不为空时,分配失败;不能构造空栈
if(!S.base)exit(OVERFLOW);
//初始化时为空栈,所以栈顶与栈底初始为同一地方 ;
S.top=S.base;
cout<<"初始化成功!"<<endl;
S.stacksize=MAXSIZE;
cout<<"构造完毕!"<<endl;
return 1;
}
//入栈
int Push(SqStack &S,int e)//插入元素为e的栈顶元素;
{
//判断是否栈满。
if(S.top-S.base==S.stacksize)
{
cout<<"栈满,插入失败!"<<endl;
return 0;
}
//元素e压入栈顶,栈顶指针加1;
*S.top++=e;
cout<<"插入成功!"<<endl;
//int a=1;
a++;
cout<<"当前栈中元素有"<<a<<"个!"<<endl;
return 1;
}
//出栈
int Pop(SqStack &S,int e)//删除栈顶元素,用e返回其值;
{
//若为空栈,则删除失败。
if(S.top==S.base)
{
cout<<"删除失败!"<<endl;
//return ERROR;
}
//否则,栈顶指针减去1,并赋给e;
e=*--S.top;
cout<<"删除成功!"<<endl;
return 1;
}
//取栈栈顶元素
int GetTop(SqStack S)//返回栈顶元素,不修改栈顶指针
{
//栈非空;
if(S.top!=S.base)
//返回栈顶元素的值,栈顶指针不变;
cout<<"操作成功!"<<endl;
return *(S.top-1);
}
int main()
{
int e;
SqStack S;
InitStack(S);
cout<<"请输入要入栈的个数:"<<endl;
int a1;
cin>>a1;
for(int i=0;i<a1;i++)
{
cin>>e;
Push(S,e);
}
cout<<"请输入要出栈的个数:"<<endl;
int a2;
cin>>a2;
if(a2<a1)
{
for(int i=0;i<a2;i++)
{
Pop(S,e);
a--;
cout<<"当前栈中元素有:"<<a<<"个!"<<endl;
}
}
else
{
cout<<"栈中没有"<<a2<<"种元素"<<endl;
}
cout<<"栈顶元素为"<<--*S.top<<endl;
GetTop(S);
}
总结
OMG,忍不住吐槽一句,我终于写出来了!!!
时间是验证真理的唯一标准,尽管这次是按照课本写的,但也让我向数据结构的大门迈进了一个脚指头(大笑)。
第一次写需要注意的是要缕清思路,明白第一步要干什么,第二步要干什么,一步一步来,才能稳扎稳打。
对于顺序栈,首先当然是先要初始化分配内存啦,这也是我第一次在C++中使用new这个函数;之前不知道怎么用的,顺便百度学习一下,下面是具体的使用方法;
new函数使用方法
S.base=new int[MAXSIZE];
> 1. new( ) 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量;
2. new[ ] 分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量;
接下来就是对栈进行一些操作来满足需求;在这需要注意的是,因为是顺序栈,最大空间容量受限制,虽然可以重新分配空间,但工作量大,不如用链栈(这是下一节要学的·)。所以,在每次操作前应该判断是否栈满栈空。
如何判断栈满和栈空呢
说明:base为栈底指针;
top为栈顶指针;
MAXSIZE为最大空间容量,也是stacksize;
1.判断栈满
了解的都知道,栈满的时候,栈顶-栈底=最大空间容量。
所以:
S.top-S.base==S.stacksize//这种情况为栈满,
2.判断栈空
栈空的时候,栈底与栈顶指向同一地方。即:
S.top==S.base//栈空;
暂时就这么多,感谢亲爱的某学长!!!