#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define MAXSIZE 100
using namespace std;
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef int SElemType;
typedef int Status;
typedef struct
{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize; //栈可用的最大容量
} SqStack;
//01 初始化一个空栈
Status InitStack(SqStack &S)
{
S.base=new SElemType [MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base;//top初始为base,空栈
S.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
return OK;
}
//02 随机创建一个正整数值的栈(当输入-1时创建结束 )
Status CreateStack(SqStack &S)
{
InitStack(S);
int i=0;
int n;
printf("输入正整数(输入-1时结束输入):");
while(i<S.stacksize)
{
//printf("输入正整数:");
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)//入栈,插入元素e为新的栈顶元素
{//S是一个结构体变量,不是指针,S相当a=10;入栈一个数S发生变化了,因此需要&
printf("输入要插入的元素e:");
scanf("%d",&e);
if(S.top-S.base==S.stacksize) return ERROR; //栈满
*S.top++=e;
// *S.top=e;
// S.top++;
printf("入栈元素为:%d\n",e);
return OK;
}
//04 出栈
Status Pop(SqStack &S,SElemType &e)//出栈,删除S的栈顶元素,用e返回其值
{//S,e均为实体变量,出栈后,其值均发生变化,要传回实参,故加&
if(S.top==S.base) return ERROR;//栈空
e=*--S.top;
return OK;
}
//05 返回S的栈顶元素,不修改栈顶指针
Status GetTop(SqStack S,SElemType &e)
{
// if(S.top!=S.base)//栈非空
// return *(S.top-1);//返回栈顶元素的值,栈顶指针不变
if(S.top==S.base) return ERROR;
e=*(S.top-1);// 注意不是S.top--,不能修改S.top的值
return OK;
}
//06 栈长
Status GetLength(SqStack S,int &Len)//栈长
{//S:值,也就是数组里的元素未修改,故不加&;e:需传回实参,故加&
if(S.top==S.base) return ERROR;
Len=S.top-S.base;//长度
printf("栈长为:%d\n",Len);
return OK;
}
//07 输出从栈底到栈顶的所有元素
Status DisplayStack(SqStack S)
{ printf("输出从栈底到栈顶的所有元素:");
if(S.top==S.base)
{
printf("空栈\n");
return ERROR;
}
int *p=S.base;
while(p<S.top)
{
cout<<*(p++)<<" "; //==printf("%d",*(p++));
}
printf("\n");
/*输出从栈顶到栈底的所有元素
int *p=S.top;
while(p>S.base)
{
p--;
cout<<*(p)<<" ";
}
*/
return OK;
}
int main()
{ int n,Len;
SElemType e;
SqStack S;
//01 初始化一个空栈
InitStack (S);
//02 随机创建一个正整数值的栈
CreateStack(S);
//03 入栈
Push(S,e);
printf("入栈一次后:");
DisplayStack(S);
//04 出栈
Pop(S,e);
printf("出栈一次后:");
DisplayStack(S);
//05 返回S的栈顶元素,不修改栈顶指针
GetTop(S,e);
//06 栈长
GetLength(S,Len);//栈长
//07 输出从栈底到栈顶的所有元素
DisplayStack(S);
}