顺序栈的实现(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掉最高点的数据%d\n", 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<iostream>
#include<stdio.h>
#include<malloc.h>
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掉最高点的数据%d\n", 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("栈的长度为:%d\n", 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;
}

一名来自北京印刷学院计科的学生

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值