#includeusing namespace std;
/*顺序栈*/
#define MAXSIZE 100
/*如果是顺序栈,栈顶和栈底指针也可以用int型,通过下标定位*/
typedef struct
{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int StackSize; //栈的容量
}SqStack;
int InitStack(SqStack &S)
{
S.base=new SElemType[MAXSIZE];//从栈底开始找,让其从栈顶出去
if(!S.base)
return 0;
S.top=S.base;//初始化为空栈
S.StackSize=MAXSIZE;//初始化栈容量
return 0;
}
/*入栈*/
int Push(SqStack &S,int e)
{
if(S.top-S.base==S.StackSize)//不确定这块指针相减的结果是否正确
return 0;//栈满退出
*S.top++=e;//从栈顶压入元素,移动栈顶指针
return 0;
}
/*出栈*/
int Pop(SqStack &S,int &e)
{
if(S.top==S.base)
return 0;//栈空
e=*--S.top;//进出栈都为栈顶
return 0;
}
/*取栈顶元素*///栈不删除元素
int GetTop(SqStack &S)
{
if(S.top==S.base)//栈非空
return *(S.top-1);
}
/*链栈*/
typedef struct StackNode
{
int elem;
struct StackNode *next;
}StackNode,*LinkStack;//类似于链表的创建//其实就是链表完成另一种使用规则
/*初始化栈链*/
int InitStack(LinkStack &S)//但是链栈的初始化只是构造一个空栈,不用设置头结点
{ S=NULL;
return 0;
}
/*入栈*/
int Push(LinkStack &S,int e)
{
StackNode *p;//结点指针
p=new StackNode;//申请空间
p->elem=e;//赋值
p->next=S;//前插,但是是以倒着看的S为栈底
S=p;//将p的位置看做栈顶
return 0;
}
/*出栈*/
int Pop(LinkStack &S,int &e)
{
e=S->elem;
StackNode *p;
p=S;//p临时保存栈顶元素,以备释放
S=S->next;//因为为前插,所以之前结点在指针位置的后面
delete p;
return 0;
}
/*取栈顶元素*/
int GetTop(LinkStack S)//INT 为要返回的元素的值的类型
{
if(S!=NULL)
return S->elem;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复