顺序栈的基本操作

目录

一、增加一个检查容量并增容的函数

二、基本操作


一、增加一个检查容量并增容的函数

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值