IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 顺序栈的实现(C/C++) -> 正文阅读

[C++知识库]顺序栈的实现(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;
}

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:38:20  更:2021-10-01 16:38:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:04:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码