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

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

一、栈的结构定义

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;	 
		} 
	}
}
相关推荐
小指纹4 小时前
图论-最短路Dijkstra算法
数据结构·c++·算法·深度优先·图论
再卷也是菜7 小时前
数据结构(12)二叉树
数据结构
qq_513970447 小时前
力扣 hot100 Day63
数据结构·算法·leetcode
lifallen7 小时前
AbstractExecutorService:Java并发核心模板解析
java·开发语言·数据结构·算法
神器阿龙7 小时前
排序算法-归并排序
数据结构·算法·排序算法
爱吃KFC的大肥羊10 小时前
C/C++常用字符串函数
c语言·数据结构·c++·算法
武文斌7710 小时前
嵌入式——数据结构:基础知识和链表①
数据结构
神器阿龙12 小时前
排序算法-冒泡排序
数据结构·算法·排序算法
九章数学体系13 小时前
九章数学体系:打破“吃苦悖论”,重构学习真谛
数据结构·学习·算法·数学建模·拓扑学