#include <iostream>
#include "stdio.h"
#include "stdlib.h"
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;
//00定义数据元素,数据结构,其中元素为原子类型不用结构体,数据结构包含三个域需要用结构体
#define STACK_INIT_SIZE 100 // 存储空间初始分配量 看清实验题干要求,不是maxsize
typedef struct {
SElemType *base; // base的初值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
} SqStack;
//01 初始化一个顺序栈S
Status InitSStack(SqStack &S)
{
S.base=new SElemType[STACK_INIT_SIZE];
if(!S.base)
exit(OVERFLOW);
S.top=S.base;//不能互换,前面已经给base赋过值了,这是给top赋值。互换了,不仅base错了,top也没有值。
S.stacksize=STACK_INIT_SIZE;
return OK;
}
//02 随机创建一个正整数值的栈(当输入-1时创建结束 )
Status CreateSStack(SqStack &S)
{
if(!S.base)
InitSStack(S);
int i=0;
int n;
while(i<S.stacksize)
{
cin>>n;
if(n!=-1)
{
*S.top=n;
S.top++;
}
else
break;//跳出while循环用break,程序接着执行while后面的代码;跳出程序用return;
}
return OK;
}
//03 入栈
Status Push(SqStack &S,SElemType e)//S是一个结构体变量,不是指针,函数要修改实参栈的值,故而&S,即形参变了要让实参的值也一块变, 而e的值不需返回故不加&。
{
if(S.top-S.base==S.stacksize)
return ERROR;
*S.top++=e;//入栈是对栈S的操作,top指针要变,S也跟着变,故形参要&S;
return OK;
}
//04 将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;
Status Pop(SqStack &S,SElemType &e)//S同上,同时,e的值要传递给实参,让实参的值变成e,因此也要&e。
{
if(S.top==S.base)
{
printf("空栈\n");
return ERROR;
}
e=*(--S.top);//栈顶指针要变,先--,后把栈顶元素值返回,代码执行完,栈整体就少了一个元素
return OK;
}
//05 输出栈顶元素的值
Status GetTop(SqStack S,SElemType &e)//e的值要传回给实参,因此要&e,但S的值不需传回实参,也就是函数功能上没要求改变主函数中的实参,故不用加&。
{
if(S.top==S.base)
{
printf("空栈\n");
return ERROR;
}
e=*(S.top-1); //返回栈顶元素,但栈顶指针不能变,所以不能S.top--。
return OK;
}
//06求栈的长度;
Status GetLength(SqStack S,SElemType &len)//e的值要传递给实参,因此要&e,但S的值没变不用加&。
{
if(S.top==S.base)
{
printf("空栈\n");
return ERROR;
}
len=S.top-S.base;
return OK;
}
//07 输出从栈底到栈顶的所有元素,不能改变栈,如TOP指针等。
Status DisplaySStack(SqStack S)
{
if(S.top==S.base)
{
printf("空栈\n");
return ERROR;
}
int *p=S.base;
while(p<S.top)
{
cout<<*(p++)<<" "; //==printf("%d",*(p++));
}
/*输出从栈顶到栈底的所有元素
int *p=S.top;
while(p>S.base)
{
p--;
cout<<*(p)<<" ";
}
*/
return OK;
}
void main()
{
SqStack S;
int i=InitSStack(S);//01栈的初始化
printf("栈初始化状态:%d\n栈的长度是:%d\n",i,S.stacksize);//测试栈是否初始化成功
CreateSStack(S);//02栈的创建
printf("栈底到栈顶的元素是:");
DisplaySStack(S);
printf("\n入栈一个数,请输入:");
int x;
cin>>x;
Push(S,x);//03入栈
DisplaySStack(S);
int y;
printf("\n弹出栈顶元素是:");
Pop(S,y);//04出栈
cout<<y<<endl;
DisplaySStack(S);
int z;
printf("\n读取栈顶元素:");
GetTop(S,z);//05读栈顶元素
cout<<z<<endl;
DisplaySStack(S);
int len;
printf("\n栈的长度是:");
GetLength(S,len);//06读栈长
cout<<len<<endl;
cout<<"当前栈是:";
DisplaySStack(S);//07打印当前栈
system("pause");//用于函数输出屏幕暂停,以便观察
}