#include <iostream>
#include <malloc.h>
#define STACK_INIT_LENGTH 100 //栈初始化容量
#define STACK_ADD 20 //扩栈增量
#define OK 1
#define ERROR -1
using namespace std;
//栈和树
/* 栈的基本功能的实现:
1.栈的初始化
2.栈中元素初始化
3.入栈(每次一个元素)
4.出栈(每次一个元素)
5.按出栈顺序显示当前栈中元素
6.反出栈顺序显示当前栈中元素
7.清空栈(清空元素)
8.销毁栈(清除内存)*/
typedef int status; //定义函数返回状态
typedef int Elemtype; //栈中元素类型均为int
struct Stack //栈结构体
{
Elemtype *base; //栈底指针
Elemtype *top; //栈顶指针
int Stack_NowLength; //实时栈总容量
int Mark; //记录栈顶指针位置 -1表示没有栈中没有元素
};
status Init_Stack(struct Stack &S) //1.初始化栈
{
S.base = (Elemtype *)malloc(sizeof(Elemtype)*STACK_INIT_LENGTH); //采用malloc的方式分配内存
if(S.base == NULL)
{
cout<<"初始化失败!"<<endl;
return ERROR;
}
S.top = S.base;
S.Stack_NowLength = STACK_INIT_LENGTH;
S.Mark = 0;
cout<<"初始化成功!"<<endl;
return OK;
}
status InitEle_Stack(struct Stack &S) //2.栈中元素初始化
{
if(S.base != S.top)
{
cout<<"栈不为空"<<endl;
return ERROR;
}
int n;
cout<<"请输入初始时栈中元素个数(小于100):"<<endl; //规定初始时元素个数小于初始时栈的容量
cin>>n;
for(int i = 0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个元素的值"<<endl;
cin>>*(S.top);
S.top++;
S.Mark++;
} //初始化后S.top指向栈顶元素的后一位
cout<<"栈中元素初始化完成!"<<endl;
return OK;
}
status Push_Stack(struct Stack &S) //3.入栈
{
if(S.top - S.base == S.Stack_NowLength+1) //判断栈满 由于每次入栈都是一个元素 所以条件直接写成判断等于就可以
{
S.base = (Elemtype*) realloc( S.base,(S.Stack_NowLength +STACK_ADD )* sizeof (Elemtype)); //若栈满,用realloc扩栈
if(S.base == NULL)
{
cout<<"扩栈失败!"<<endl;
return ERROR;
}
S.Stack_NowLength += STACK_ADD;
S.top = S.base+S.Stack_NowLength;
cout<<"扩栈成功!"<<endl;
}
cout<<"请输入入栈元素:"<<endl;
cin>>*(S.top);
S.top++;
cout<<"入栈成功!"<<endl;
return OK;
}
status Pop_Stack(struct Stack &S) //4.出栈(仅显示出栈的值,不返回出栈值)
{
S.top--;
if(S.top == NULL)
{
cout<<"栈为空!"<<endl;
return ERROR;
}
cout<<"出栈元素为:"<<*(S.top)<<endl;
return OK;
}
status PoDisplay_Stack(struct Stack &S) //5.按出栈顺序显示当前栈中元素
{
if(S.top == S.base)
{
cout<<"栈为空!"<<endl;
return ERROR;
}
cout<<"按出栈顺序显示当前栈中元素为:"<<endl;
Elemtype *p = NULL;
p = S.top;
p--;
while(p != S.base-1)
{
cout<<*p<<endl;
p--;
}
return OK;
}
status NeDisplay_Stack(struct Stack &S) //6.反出栈顺序显示当前栈中元素
{
if(S.top ==S.base)
{
cout<<"栈为空!"<<endl;
return ERROR;
}
cout<<"反出栈顺序显示当前栈中元素为:"<<endl;
Elemtype *p = NULL;
p = S.base;
while(p != S.top) //S.top始终指向的就是栈顶元素的下一位
{
cout<<*p<<endl;
p++;
}
return OK;
}
status Clear_Stack(struct Stack &S) //7.清空栈
{
S.top=S.base;
cout<<"栈已清空!"<<endl;
return OK;
}
status Destroy_Stack(struct Stack &S) //8.销毁栈
{
free(S.base);
S.top = S.base;
S.base = NULL;
S.top = NULL;
S.Stack_NowLength = 0;
cout<<"栈已销毁!"<<endl;
return OK;
}
int main()
{
struct Stack S;
int i = 1,n;
cout<<"首次进入请初始化栈!"<<endl;
while(i!=0)
{
cout<<"1 初始化栈"<<endl;
cout<<"2 栈中元素初始化"<<endl;
cout<<"3 入栈(每次一个元素)"<<endl;
cout<<"4. 出栈(每次一个元素)"<<endl;
cout<<"5 按出栈顺序显示当前栈中元素"<<endl;
cout<<"6 反出栈顺序显示当前栈中元素"<<endl;
cout<<"7 清空栈"<<endl;
cout<<"8 销毁栈"<<endl;
cout<<"9 退出"<<endl;
cin>>n;
switch(n)
{
case 1 :
Init_Stack(S);
break;
case 2 :
InitEle_Stack(S);
break;
case 3 :
Push_Stack(S);
break;
case 4 :
Pop_Stack(S);
break;
case 5 :
PoDisplay_Stack(S);
break;
case 6 :
NeDisplay_Stack(S);
break;
case 7 :
Clear_Stack(S);
break;
case 8 :
Destroy_Stack(S);
break;
case 9:
i = 0;
break;
default :
cout<<"请重新输入"<<endl;
}
system("pause");
system("cls");
}
return 0;
}
实现界面: