栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

顺序栈的实现(C/C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

顺序栈的实现(C/C++)

顺序栈
顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元
依次存放自栈底到栈顶的数据元素,同时由于栈操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置置。通常以top=-1表示空栈。

该程序的功能有:

printf("======Belongs to CLC======n");
printf("======1.建立并初始化栈======n");
printf("======2.向栈进行入栈操作======n");
printf("======3.将栈中的数据输出======n");
printf("======4.对栈进行Pop操作======n");
printf("======5.获取栈的长度======n");
printf("======6.清空顺序栈======n");
printf("======0.退出程序======n");

关于程序的前定义:------(详情看代码解析)

#define SIZE 100//栈的最大容量
typedef int ElemType;//定义的抽象数据类型
typedef int CLC;//为方便以下的使用

对于顺序栈的定义:------(详情看代码解析)

typedef struct SqStack {
	ElemType* elem;//用来存储数据的
	int top_0;//实际数据存在时的顶部,初始值为:-1
	int top_1;//这是栈容量的最高点,顶部
}SqStack;//运用SqStack作为域名(自己习惯说域名)

栈的初始化:

定义好一个栈后,我们需要对栈进行初始化:------(详情看代码解析)

CLC InitStack(SqStack* S) {
	S->elem =(int *) malloc(SIZE * sizeof(ElemType));//为elem争取动态空间
	S->top_0 = -1;//设置没有数据时栈的顶部位置为-1
	S->top_1 = SIZE;//设置栈的最大容量为100
	return true;
}//初始化

栈的传参数:CLC Push(SqStack* S)------(详情看代码解析)

CLC Push(SqStack* S) {
	if (S->top_0 + 1 == SIZE) {
		printf("栈已满了,无法进栈,如栈程序退出!!!n");
		return false;
	}//判断栈是否为满,满的话就终止此函数
	printf("请输入你要入栈的数据个数:");
	int Num;
	scanf_s("%d", &Num);//由于输入数据的个数不能超过SIZE,所以在for循环中就添加了限定语句
	for (int i = 0; i < Num || i < SIZE; i++) {
		scanf_s("%d", & S->elem[i]);
		S->top_0 = i;
	}//依次向栈由下至上赋值
	return true;
}

栈的输出:Display(SqStack* S) ------(详情看代码解析)

判断栈是否为空的方法,也就是查看栈的栈顶是否为-1(一开始我们将栈顶top_0=-1),如果是-1,则这个栈就是空的,否则则反。

CLC Display(SqStack* S) {
	if (S->top_0  ==-1 ) {
		printf("栈为空,无法输出,程序退出!!!n");
		return false;
	}//判断表格是否空,空则终止程序
	for (int i = S->top_0; i >= 0; i--) {
		printf("%d ", S->elem[i]);
	}//依次从栈顶将数据输出
	return true;
}//栈的输出

栈的Pop操作:CLC POP(SqStack* S)  ------(详情看代码解析)

CLC POP(SqStack* S) {
	if (S->top_0 == -1) {
		printf("栈为空,程序退出!!n");
		return false;
	}//判断栈是否为空,空则终止函数
	printf("Pop掉最高点的数据%dn", S->elem[S->top_0]);
	S->top_0--;//从栈顶开始Pop
	return true;
}//栈的Pop操作

其中栈的长度是很好求的,直接在main()中使用对象.top_0+1就可以获得栈的长度了

对于清空栈,就相当于重新初始化这个栈就可以了,初始化后他的栈顶就等于-1.

main()函数主体代码:------(详情看代码中的解析)

int main()
{
	int i;
	string answer;
	SqStack S;//使用定义中的SqStack来定义对象 S
	while (true) {
	start:
		printf("======请输入数字进行操作:======n");
		printf("======1.建立并初始化栈======n"); 
		printf("======2.向栈进行入栈操作======n");
		printf("======3.将栈中的数据输出======n"); 
		printf("======4.对栈进行Pop操作======n"); 
		printf("======5.获取栈的长度======n");
		printf("======6.清空顺序栈======n");
		printf("======0.退出程序======n");
		scanf_s("%d", &i);
		switch (i) {
		case 1:
			InitStack(&S);//调用函数使栈初始化
			printf("n建立并初始化栈完毕!!n");
			system("pause");//代码停止作用
			system("cls");//程序清屏作用
			goto start;//回到start的位置
		case 2:
			Push(&S);调用函数Push来给栈存入数据
			printf("进栈完毕!!n");
			system("pause");
			system("cls");
			goto start;
		case 3:
			Display(&S);调用函数来将栈中的数据打印出来
			system("pause");
			system("cls");
			goto start;
		case 4:
			POP(&S);//调用POP函数来进行栈的Pop操作
			printf("进行POP程序完成!!!n");
			system("pause");
			system("cls");
			goto start;
		case 5:
			printf("栈的长度为:%d", S.top_0 + 1);//直接将栈顶的值+1来实现长度
			system("pause");
			system("cls");
			goto start;
		case 6:
			InitStack(&S);//调用初始化函数来将栈进行清空
			printf("清空栈完毕!!n");
			system("pause");
			system("cls");
			goto start;
		case 0://退出整个程序的代码
			printf("确定退出程序吗?(yes or no):");
			cin >> answer;
			if (answer == "yes" || answer == "YES")exit(0);
			if (answer == "no" || answer == "NO") {
				system("pause");
				system("cls");
				goto start;
			}
		}
		
	}
	return 0;
}

完整代码如下:

#include
#include
#include
using namespace std;

#define SIZE 100//栈的最大容量
typedef int ElemType;//定义的抽象数据类型
typedef int CLC;//为方便以下的使用

typedef struct SqStack {
	ElemType* elem;//用来存储数据的
	int top_0;//实际数据存在时的顶部,初始值为:-1
	int top_1;//这是栈容量的最高点,顶部
}SqStack;//运用SqStack作为域名(自己习惯说域名)
CLC InitStack(SqStack* S) {
	S->elem = (int*)malloc(SIZE * sizeof(ElemType));//为elem争取动态空间
	S->top_0 = -1;//设置没有数据时栈的顶部位置为-1
	S->top_1 = SIZE;//设置栈的最大容量为100
	return true;
}//初始化
CLC Push(SqStack* S) {
	if (S->top_0 + 1 == SIZE) {
		printf("栈已满了,无法进栈,如栈程序退出!!!n");
		return false;
	}//判断栈是否为满,满的话就终止此函数
	printf("请输入你要入栈的数据个数:");
	int Num;
	scanf_s("%d", &Num);//由于输入数据的个数不能超过SIZE,所以在for循环中就添加了限定语句
	for (int i = 0; i < Num && i < SIZE; i++) {
		scanf_s("%d", &S->elem[i]);
		S->top_0 = i;
	}//依次向栈由下至上赋值
	return true;
}//Push赋值操作
CLC Display(SqStack* S) {
	if (S->top_0 == -1) {
		printf("栈为空,无法输出,程序退出!!!n");
		return false;
	}//判断表格是否空,空则终止程序
	for (int i = S->top_0; i >= 0; i--) {
		printf("%d ", S->elem[i]);
	}//依次从栈顶将数据输出
	return true;
}//栈的输出
CLC POP(SqStack* S) {
	if (S->top_0 == -1) {
		printf("栈为空,程序退出!!n");
		return false;
	}//判断栈是否为空,空则终止函数
	printf("Pop掉最高点的数据%dn", S->elem[S->top_0]);
	S->top_0--;//从栈顶开始Pop
	return true;
}//栈的Pop操作
int main()
{
	int i;
	string answer;
	SqStack S;//使用定义中的SqStack来定义对象 S
	while (true) {
	start:
		printf("======Belongs to CLC======n");
		printf("======1.建立并初始化栈======n");
		printf("======2.向栈进行入栈操作======n");
		printf("======3.将栈中的数据输出======n");
		printf("======4.对栈进行Pop操作======n");
		printf("======5.获取栈的长度======n");
		printf("======6.清空顺序栈======n");
		printf("======0.退出程序======n");
		printf("请输入数字进行操作:n");
		scanf_s("%d", &i);
		switch (i) {
		case 1:
			InitStack(&S);//调用函数使栈初始化
			printf("建立并初始化栈完毕!!n");
			system("pause");//代码停止作用
			system("cls");//程序清屏作用
			goto start;//回到start的位置
		case 2:
			Push(&S); //调用函数Push来给栈存入数据
			printf("进栈完毕!!n");
			system("pause");
			system("cls");
			goto start;
		case 3:
			Display(&S); //调用函数来将栈中的数据打印出来
			printf("n输出数据完毕!!n");
			system("pause");
			system("cls");
			goto start;
		case 4:
			POP(&S);//调用POP函数来进行栈的Pop操作
			printf("进行POP程序完成!!!n");
			system("pause");
			system("cls");
			goto start;
		case 5:
			printf("栈的长度为:%dn", S.top_0 + 1);//直接将栈顶的值+1来实现长度
			system("pause");
			system("cls");
			goto start;
		case 6:
			InitStack(&S);//调用初始化函数来将栈进行清空
			printf("清空栈完毕!!n");
			system("pause");
			system("cls");
			goto start;
		case 0://退出整个程序的代码
			printf("确定退出程序吗?(yes or no):");
			cin >> answer;
			if (answer == "yes" || answer == "YES")exit(0);
			if (answer == "no" || answer == "NO") {
				system("pause");
				system("cls");
				goto start;
			}
			else {
				printf("输入指令有误,程序继续!!n");
				system("pause");
				system("cls");
				goto start;
			}
		}

	}
	return 0;
}

版权属于作者 New Bull       未经允许不可转载,否者将追究版权问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290609.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号