【数据结构】栈的顺序存储(整型栈、字符栈)

【数据结构】栈的顺序存储(整型栈、字符栈)

一、栈的结构定义

MaxSize: 顺序栈的长度

s.top: 指针,指向栈顶元素。当栈为空时,指向-1。

s.data[MaxSize]: 顺序栈,用数组表示

c 复制代码
#define MaxSize 50
typedef struct SqStack{
	char data[MaxSize]; // 数据 
	int top; // 指针 
}SqStack;
栈空 s.top = -1
栈满 s.top = MaxSize - 1
栈顶元素 s.data[s.top]
栈的当前元素个数 s.top + 1(因为元素从索引0开始,所以元素个数是:索引值+1)

二、字符栈的初始化、入栈、出栈、判断是否栈为空、获取栈顶元素、获取栈的当前元素个数等操作

c 复制代码
#include <stdio.h>
using namespace std;

#define MaxSize 50
typedef struct SqStack{
	char data[MaxSize]; // 数据 
	int top; // 指针 
}SqStack;

//InitStack(&s):初始化一个空栈 S。
void InitStack(SqStack &s){
	s.top = -1;
}

//StackEmpty(s):判断一个栈是否为空,若栈s为空则返回 true,否则返回 false。
bool StackEmpty(SqStack s){
	if(s.top == -1) return true;
	return false;
}

//Push(&s,x): 入栈,若栈s未满,则将x加入使之成为新栈顶。
bool Push(SqStack &s, char x){
	if(s.top == MaxSize - 1) return false;
	s.data[++s.top] = x;
	return true;
}

//Pop(&S,&x):出栈,若栈s非空,则弹出栈顶元素,并用x返回。
bool Pop(SqStack &s, char &x){
	if(s.top == -1) return false;
	x = s.data[s.top--];
	return true;
}

//GetTop(s,&x):读栈顶元素,但不出栈,若栈s非空,则用x返回顶元素。
bool GetTop(SqStack s, char &x){
	if(s.top == -1) return false;
	x = s.data[s.top];
	return true;	
}

//Destroystack(&s):销毁栈,并释放栈s占用的存储空间("&"表示引用调用)。


//getNum(s): 获取栈的当前元素个数
int GetNum(SqStack s){
	if(s.top == -1) return 0;
	return s.top + 1;
} 
int main() {
	SqStack s;
	InitStack(s); 
	bool flag = true;
	int choose;
	while(flag){
		printf("\n=======================\n");
		printf("1.入栈\n");
		printf("2.出栈\n");
		printf("3.判断是否栈为空\n");
		printf("4.读栈顶元素\n");
		printf("5.获取栈的当前元素个数\n");
		printf("6.退出\n");
		printf("=======================\n");
		printf("请选择:");
		scanf("%d", &choose);
		switch(choose) {
			case 1:
				char x;
				printf("输入要新入栈的字符:");
				scanf(" %c", &x); // 注意,此时%c前面需要加个空格,使得scanf跳过任何空白字符(包括换行符),然后读取下一个非空白字符。 
				if(Push(s, x)) printf("成功把%c入栈!\n", x);
				else printf("入栈失败!\n");
				break;
			case 2:
				char x2;
				if(Pop(s, x2)) printf("%c出栈成功!\n", x2);
				else printf("出栈失败!\n");
				break;
			case 3:
				if(StackEmpty(s)) printf("栈为空!\n");
				else printf("栈暂时不为空!\n");
				break;
			case 4:
				char x3;
				if(GetTop(s, x3)) printf("当前栈的栈顶元素是:%c\n", x3);
				else printf("出错!\n");
				break;
			case 5:
				printf("栈的当前元素个数是:%d", GetNum(s));
				break;
			case 6:
				flag = false;
				break; 
			default:
				printf("非法输入!\n");
				break;	 
		} 
	}
}

三、整型栈的初始化、入栈、出栈、判断是否栈为空、获取栈顶元素、获取栈的当前元素个数等操作

很简单,只是把data数组及参数x的数据类型从char改为int类型就好了。

c 复制代码
#include <bits/stdc++.h>
using namespace std;

/*
栈空: top = -1
栈满: top = MaxSize - 1
栈顶元素: SqStack[top] 
*/
#define MaxSize 50
typedef struct SqStack{
	int data[MaxSize]; // 数据 
	int top; // 指针 
}SqStack;

//InitStack(&s):初始化一个空栈 S。
void InitStack(SqStack &s){
	s.top = -1;
}

//StackEmpty(s):判断一个栈是否为空,若栈s为空则返回 true,否则返回 false。
bool StackEmpty(SqStack s){
	if(s.top == -1) return true;
	return false;
}

//Push(&s,x): 入栈,若栈s未满,则将x加入使之成为新栈顶。
bool Push(SqStack &s, int x){
	if(s.top == MaxSize - 1) return false;
	s.data[++s.top] = x;
	return true;
}

//Pop(&S,&x):出栈,若栈s非空,则弹出栈顶元素,并用x返回。
bool Pop(SqStack &s, int &x){
	if(s.top == -1) return false;
	x = s.data[s.top--];
	return true;
}

//GetTop(s,&x):读栈顶元素,但不出栈,若栈s非空,则用x返回顶元素。
bool GetTop(SqStack s, int &x){
	if(s.top == -1) return false;
	x = s.data[s.top];
	return true;	
}

//Destroystack(&s):销毁栈,并释放栈s占用的存储空间("&"表示引用调用)。


//getNum(s): 获取栈的当前元素个数
int GetNum(SqStack s){
	if(s.top == -1) return 0;
	return s.top + 1;
} 
int main() {
	SqStack s;
	InitStack(s); 
	bool flag = true;
	int choose;
	while(flag){
		printf("\n=======================\n");
		printf("1.入栈\n");
		printf("2.出栈\n");
		printf("3.判断是否栈为空\n");
		printf("4.读栈顶元素\n");
		printf("5.获取栈的当前元素个数\n");
		printf("6.退出\n");
		printf("=======================\n");
		printf("请选择:");
		scanf("%d", &choose);
		switch(choose) {
			case 1:
				int x;
				printf("输入要新入栈的字符:");
				scanf("%d", &x);
				if(Push(s, x)) printf("成功把%d入栈!\n", x);
				else printf("入栈失败!\n");
				break;
			case 2:
				int x2;
				if(Pop(s, x2)) printf("%d出栈成功!\n", x2);
				else printf("出栈失败!\n");
				break;
			case 3:
				if(StackEmpty(s)) printf("栈为空!\n");
				else printf("栈暂时不为空!\n");
				break;
			case 4:
				int x3;
				if(GetTop(s, x3)) printf("当前栈的栈顶元素是:%d\n", x3);
				else printf("出错!\n");
				break;
			case 5:
				printf("栈的当前元素个数是:%d", GetNum(s));
				break;
			case 6:
				flag = false;
				break; 
			default:
				printf("非法输入!\n");
				break;	 
		} 
	}
}
相关推荐
ʚ希希ɞ ྀ5 分钟前
二叉树的层序遍历
数据结构·算法
Tiny番茄41 分钟前
leetcode 3. 无重复字符的最长子串
数据结构·python·算法·leetcode
Miraitowa_cheems6 小时前
LeetCode算法日记 - Day 68: 猜数字大小II、矩阵中的最长递增路径
数据结构·算法·leetcode·职场和发展·贪心算法·矩阵·深度优先
希赛网6 小时前
软考软件设计师常考知识点:(三)数据结构
数据结构·二叉树·字符串·软考·软件设计师·线性表
少许极端11 小时前
算法奇妙屋(五)-链表
数据结构·算法·链表
木子.李34712 小时前
数据结构-算法C++(额外问题汇总)
数据结构·c++·算法
程序员莫小特13 小时前
老题新解|计算2的N次方
开发语言·数据结构·算法·青少年编程·信息学奥赛一本通
十重幻想15 小时前
PTA6-1 使用函数求最大公约数(C)
c语言·数据结构·算法
青岛少儿编程-王老师15 小时前
CCF编程能力等级认证GESP—C++5级—20250927
java·数据结构·c++
胖咕噜的稞达鸭18 小时前
C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数
java·c语言·开发语言·数据结构·c++·redis·算法