目录
一、增加一个检查容量并增容的函数
bool CheckStack(SqStack& s)//检查内存空间是否足够
{
if (s.size == s.stacksize)
{
int newstacksize = s.stacksize == 0 ? 4 : s.stacksize * 2;
//先看等号右边,s.stacksize为0,那么输出4,让newstacksize=4;
//如果 s.stacksize不为0,那么让执行 s.stacksize*2
ElemType* tmp = (ElemType*)realloc(s.data, newstacksize * sizeof(ElemType));
if (tmp == 0)
{
cout << "开辟空间失败" << endl;
exit(-1);//直接退出
}
else
{
s.data = tmp;//把动态开辟的空间给data数组
s.stacksize = newstacksize;//重新定义最大容量(也是元素个数)
}
}
return true;
}
二、基本操作
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<stdbool.h>
using namespace std;
//typedef int ElemType;
typedef char ElemType;
//方法一:使用定长的数组
//#define Maxsize 10
//typedef struct
//{
// ElemType data[Maxsize];
// int top;//top用来存放栈顶元素的下标,当top为-1的时候表示空栈
// int stacksize;//栈可用的最大容量
//}SqStack;
//法二:使用动态开辟的数组存放
#define Maxsize 5
typedef struct
{
ElemType * data;
int top;
int size;//实际存放元素的个数
int stacksize;//最大容量
}SqStack;
void InitStack(SqStack& s);//初始化
bool CheckStack(SqStack& s);//检查容量并且扩容
bool PushStack(SqStack& s, ElemType x); //进栈
bool PushStack2(SqStack& s);//录入元素,多次进栈
bool PopStack(SqStack& s, ElemType &x);//出栈
bool GetTop(SqStack& s,ElemType &x);//读栈
bool DelStack(SqStack& s);//删除栈顶元素
int Length(SqStack& s);//求元素个数
bool print(SqStack& s);//遍历
bool DestroyStack(SqStack& s);//清空栈
void menu();//菜单
#include"SqStackList.h"
//定长数组
//void InitStack(SqStack& s)//初始化,构造一个空栈
//{
// s.top = -1;
//}
void InitStack(SqStack& s)//动态开辟空间
{
s.top = -1;
//s.data = (ElemType*)malloc(sizeof(ElemType));
s.data = NULL;
s.size = s.stacksize = 0;
}
bool CheckStack(SqStack& s)//检查内存空间是否足够
{
if (s.size == s.stacksize)
{
int newstacksize = s.stacksize == 0 ? 4 : s.stacksize * 2;
//先看等号右边,s.stacksize为0,那么输出4,让newstacksize=4;
//如果 s.stacksize不为0,那么让执行 s.stacksize*2
ElemType* tmp = (ElemType*)realloc(s.data, newstacksize * sizeof(ElemType));
if (tmp == 0)
{
cout << "开辟空间失败" << endl;
exit(-1);
}
else
{
s.data = tmp;//把动态开辟的空间给data数组
s.stacksize = newstacksize;//重新定义最大容量(也是元素个数)
}
}
return true;
}
bool PushStack(SqStack & s, ElemType x)//进栈
{
if (s.top == s.stacksize - 1)
{
CheckStack(s);//检查容量并扩容,如果容量不足,checkstack()函数会直接退出
}
s.top = s.top + 1;
s.data[s.top]=x;
s.size++;
return true;
}
bool PushStack2(SqStack& s)//建表(多次进栈)
{
ElemType x;
cout << "请依次输入数据:" << endl;
cin >> x;
//while(x!=999)
while (x != 'A')
{
CheckStack(s);
PushStack(s, x);
cin >> x;
}
cout << endl;
return true;
}
bool PopStack(SqStack& s, ElemType &x)//出栈
{
if (s.top == -1)
{
cout << "出栈失败!" << endl;
return false;
}
else
{
x = s.data[s.top];
s.top--;//修改栈顶指针
s.size--;
}
cout << "出栈成功!" << endl;
return true;
}
bool GetTop(SqStack& s,ElemType &x)//取栈顶元素
{
if (s.top == -1)
{
cout << "栈已空!" << endl;
return false;
}
else
x = s.data[s.top];
//cout << x << endl;
return true;
}
bool print(SqStack& s)//遍历
{
int top2 = s.top;
if (s.top == -1)
{
cout << "栈已空!" << endl;
return false;
}
while (top2 != -1)
{
cout << s.data[top2]<<" ";
top2--;
}
cout << endl;
return true;
}
int Length(SqStack& s)//求元素个数
{
int j = 0;
if (s.top != -1)
{
j = s.top + 1;
}
s.size = j;
return j;
}
bool DelStack(SqStack& s)//删除栈顶元素
{
if (s.top == -1)
{
cout << "栈已空!" << " ";
return false;
}
else
s.top--;
cout << endl;
return true;
}
bool DestroyStack(SqStack& s)//清空栈
{
if (s.top != -1)
{
s.top = -1;
}
s.size=s.stacksize=0;
free(s.data);
cout << "清除成功!" << endl;
return true;
}
void menu() //显示菜单
{
printf("\n");
cout << "-------------------------------------------------欢迎使用该系统-------------------------------------------------" << endl;
cout << " 1、录入数据 " << endl;
cout << " 2、求元素个数 " << endl;
cout << " 3、出栈 " << endl;
cout << " 4、读取栈顶元素 " << endl;
cout << " 5、遍历 " << endl;
cout << " 6、清空栈 " << endl;
cout << " 7、退出系统 " << endl;
}
#include"SqStackList.h"
int main()
{
/*ElemType x=0;
SqStack s;
InitStack(s);
PushStack(s, 'm');
PushStack(s, 'y');
PushStack2(s);
print(s);
GetTop(s);
PopStack(s, x);
cout << x;
cout<<Length(s);
DestroyStack(s);
cout << Length(s);*/
SqStack s;
InitStack(s);
int number;
while (1)
{
menu();
cout << "请输入菜单编号:";
cin >> number;
switch (number)
{
case 1:PushStack2(s); break;
case 2:
cout<<Length(s); break;
case 3:
ElemType x1;
PopStack(s, x1);
break;
case 4:
ElemType x2;
GetTop(s, x2);
cout << x2; break;
case 5:print(s); break;
case 6:DestroyStack(s); break;
case 7:exit(0); break; //退出
default:printf("输入有误!"); exit(0);
}
}
return 0;
}