数据结构---顺序栈、链栈

特点

typedef struct Stack { int* base; //栈底 int* top;//栈顶 int stacksize //栈的容量; }SqStack;

typedef struct StackNode { int data;//数据域 struct StackNode* next; //指针域 }StackNode,*LinkStack;

顺序栈

cpp 复制代码
#define MaxSize 100
typedef struct Stack { int* base; int* top; int stacksize; }SqStack;

//***********************************   基本操作函数  *******************************************

int InitStack(SqStack& s)
{
	
	s.base = new int[MaxSize];

	s.top = s.base;

	s.stacksize = MaxSize;
	return 1;

}

int Push(SqStack& s, int e)		// Push入栈,到XXX	eg: pushd...
{
	if(s.top-s.base==s.stacksize)	return 0;
	*(s.top++) = e;		return 1;
}

int Pop(SqStack& s, int e) {
	if(s.top==s.base)	return 0;
	e = *--s.top;	 return 1;		// 1、减减		2、指向栈顶元素		3、再给e
}	

bool GetTop(SqStack& s, int e) {
	if(s.top=s.base)	return false;
	else   e = *--s.top;	return true;
}


//********************************功能实现函数**************************************//

void PushToStack(SqStack& s) {
	int n; int e; int flag;
	printf("请输入入栈元素个数(>=1):\n");
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		printf("请输入第%d个元素的值:", i + 1);
		scanf("%d", &e);
		flag = Push(s, e);
		if (flag)printf("%d已入栈\n", e);
		else { printf("栈已满!!!\n"); break; }
	}
}

void PopFromStack(SqStack& s) {
	int n; int e; int flag;
	printf("请输入出栈元素个数(>=1):\n");
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		flag = Pop(s, e);
		if (flag)printf("%d已出栈\n", e);
		else { printf("栈已空!!!\n"); break; }
	}
}

void GetTopOfStack(SqStack& s){
	int e; bool flag;
	flag = GetTop(s, e);
	if (flag)printf("栈顶元素为:%d\n", e);
	else printf("栈已空!!!\n");
}



void memu() {
	printf("********1.入栈      2.出栈*********\n");
	printf("********3.取栈顶    4.退出*********\n");
}

int main() {
	int choice = 0;;
	SqStack s;
	InitStack(s);

	switch (choice)
	{
	case 1:PushToStack(s); break;
	case 2:PopFromStack(s); break;
	case 3:GetTopOfStack(s); break;;
	default:
		printf("输入错误!!!\n");
		break;
	}
	return 0;
}

链栈

cpp 复制代码
typedef struct StackNode { int data; struct StackNode* next; }StackNode,*LinkStack;

//***********************************   基本操作函数  *******************************************

int InitStack(LinkStack &s)
{
	s = NULL;
	return 1;

}

int Push(LinkStack &s, int e)		
{
	StackNode* p;
	//生成新节点
	p = new StackNode;
	//赋值
	p->data = e;
	p->next = s;
	//压入栈顶
	s = p;
	return 1;
}


bool Pop(LinkStack& s ,int& e)
{
	LinkStack p;
	if (s == NULL)return false;//栈空
	e = s->data;
	p = s;
	s = s->next;
	free(p);
	return true;
}

bool GetTop(LinkStack &s, int &e) 
{
	if (s == NULL) return false;//栈顶为空
	e = s->data;
	return true;
}



//********************************功能实现函数**************************************//

void PushToStack(LinkStack& s) {
	int n; int e; int flag;
	printf("请输入入栈元素个数(>=1):\n");
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		printf("请输入第%d个元素的值:", i + 1);
		scanf("%d", &e);
		flag = Push(s, e);
		if (flag)printf("%d已入栈\n", e);
	}

}

void PopFromStack(LinkStack& s) {
	int n; int e; int flag;
	printf("请输入出栈元素个数(>=1):\n");
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		flag = Pop(s, e);
		if (flag)printf("%d已出栈\n", e);
		else { printf("栈已空!!!\n"); break; }
	}
}

void GetTopOfStack(LinkStack& s){
	int e; bool flag;
	flag = GetTop(s, e);
	if (flag)printf("栈顶元素为:%d\n", e);
	else printf("栈已空!!!\n");
}



void memu() {
	printf("********1.入栈			2.出栈*********\n");
	printf("********3.取栈顶元素    4.退出*********\n");
}

int main() {
	int choice = 0;;
	LinkStack s;
	InitStack(s);

	switch (choice)
	{
	case 1:PushToStack(s); break;
	case 2:PopFromStack(s); break;
	case 3:GetTopOfStack(s); break;;
	default:
		printf("输入错误!!!\n");
		break;
	}
	return 0;
}
相关推荐
努力学算法的蒟蒻几秒前
day14(11.14)——leetcode面试经典150
算法·leetcode
洛_尘14 分钟前
数据结构--6:优先级队列(堆)
java·数据结构
让我们一起加油好吗19 分钟前
【数据结构】并查集(操作详解 + 模板 + 练习)
数据结构·算法·并查集·洛谷
PenguinLeee22 分钟前
KKT条件:对偶问题、KKT条件以及内点法
算法·凸优化
序属秋秋秋33 分钟前
《Linux系统编程之进程基础》【进程入门】
linux·运维·c语言·c++·进程·系统编程·fork
晨非辰1 小时前
【数据结构】排序详解:从快速排序分区逻辑,到携手冒泡排序的算法效率深度评测
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
Blossom.1181 小时前
大模型知识蒸馏实战:从Qwen-72B到Qwen-7B的压缩艺术
大数据·人工智能·python·深度学习·算法·机器学习·pygame
.小小陈.2 小时前
数据结构6:排序
数据结构
海琴烟Sunshine4 小时前
leetcode 383. 赎金信 python
python·算法·leetcode
say_fall5 小时前
C语言编程实战:每日刷题 - day2
c语言·开发语言·学习