C语言数组实现栈

本文介绍了如何使用C语言数组来实现栈数据结构。详细讨论了栈的定义、抽象数据类型,以及栈的顺序存储结构,包括进栈push和出栈pop的操作。栈作为一种后进先出(LIFO)的数据结构,其C语言代码实现具有O(1)的时间复杂度。
部署运行你感兴趣的模型镜像

C语言数组实现栈

C语言数组形式实现栈

1.栈的定义

​ 我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不包含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO(Last In First Out)结构。

2.栈的抽象数据类型

把插入和删除操作改名为push和pop;

ADT 栈(stack)
Data
	同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
	InitStack(*S):初始条件,建立一个空栈S;
	DestroyStack(*S):若栈存在,则销毁它;
	ClearStack(*S):将栈清空;
	StackEmpty(S):若栈为空,返回true,否则返回false;
	GetTop(S,*e):若栈存在且非空,用e返回S的栈顶元素;
	Push(*S,e):若栈S存在,插入新元素e到栈S中并成为栈顶元素;
	Pop(*S,*e):删除栈S中栈顶元素,并用e返回其值;
	StackLength(S):返回栈S的元素个数
endADT

3.栈的顺序存储结构及实现

栈演示

定义一个top变量来指示栈顶元素在数组中的位置,top可以上下移动,但无论如何都不能超出存储栈的长度(StackSize),即top必须小于StackSize。当栈存在一个元素时,top等于0,因此通常把空栈的判定条件定为top等于-1。

栈的结构定义

typedef int SElemType;	//SElemType类型根据实际情况而定,这里假设为int */
typedef struct
{
    SElemType data[MAXSIZE];
    int top;	//用于栈顶指针
}SqStack;

进栈操作push

/* 插入元素e为新的栈顶元素 */
Status Push(SqStack *S, SElemType e)
{
    if(S->top == MAXSIZE-1)	//栈满
        return ERROR;
    S->top++;	//栈顶指针+1
    S->data[S->top] = e;
    return OK;
}

出栈操作pop

/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR */
Status Pop(SqStack *S, SElemType *e)
{
    if(S->top == -1){
        return ERROR;
    }
    *e = S->data[S->top];	//将要删除的栈顶元素赋值给e
    S->top--;	//栈顶指针-1
    return OK;
}

两者没有涉及到循环语句,所以时间复杂度为O(1)。

4.C语言代码实现

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
typedef int SElemType;

//数组方式实现栈 
typedef struct
{
	SElemType data[MAXSIZE];
	int top;	//用于栈顶指针 
}SqStack;
typedef SqStack* LinkStack;

/* 遍历栈 */
void display(LinkStack linkStack){
	int i;
	printf("栈:\n");
	for(i=linkStack->top;i>=0;i--){
		printf("%d\n",linkStack->data[i]);
	}
}

/* 初始化,建立一个空栈 */
LinkStack initStack(){
	LinkStack linkStack = (LinkStack)malloc(sizeof(SqStack));	//指针,指向栈
	linkStack->top = -1;	//表示空栈
	return linkStack; 
}
 
/* 销毁栈 */
void destroyStack(LinkStack linkStack){
	free(linkStack);
}

/* 清空栈 */
void clearStack(LinkStack linkStack){
	linkStack->top = -1;	//即置空栈 
}

/* 判断栈是否为空 */
bool stackEmpty(LinkStack linkStack){
	if(linkStack->top == -1)
		return true;
	else
		return false;
}

/* 判断栈是否满 */
bool stackFull(LinkStack linkStack){
	if(linkStack->top == MAXSIZE-1)
		return true;
	else
		return false;
}

/* 返回栈顶元素 */
bool getTop(LinkStack linkStack, SElemType *e){
	if(linkStack->top == -1){
		return false;
	}else{
		*e = linkStack->data[linkStack->top];
		return true;
	}
} 
/* 压栈 */
bool push(LinkStack linkStack, SElemType e){
	if(linkStack->top ==  MAXSIZE-1){
		printf("栈满!\n");
		return false;
	}else{
		linkStack->top++;
		linkStack->data[linkStack->top] =  e;
		return true;
	}
}

/* 出栈 */
bool pop(LinkStack linkStack, SElemType* e){
	if(linkStack->top == -1){
		printf("栈空!\n");
		return false;
	}else{
		*e = linkStack->data[linkStack->top];
		linkStack->top--;
		return true;
	}
}

/* 返回栈元素的个数 */
int stackLength(LinkStack linkStack){
	return linkStack->top+1;
}

/* 主函数 */
int main(){
	SElemType top;
	SElemType *topElem = &top;
	LinkStack linkStack = NULL;
	bool continueFlag = true;
	SElemType pushNum,popNum;
	int functionNum;	//功能号 
	while(continueFlag){
		printf("--------------菜单---------------\n");
		printf("------------1.初始化-------------\n");
		printf("------------2.销毁栈-------------\n");
		printf("------------3.清空栈-------------\n");
		printf("------------4.判断栈空-----------\n");
		printf("------------5.判断栈满-----------\n");
		printf("------------6.返回栈顶元素-------\n");
		printf("------------7.压栈---------------\n");
		printf("------------8.出栈---------------\n");
		printf("------------9.栈元素个数---------\n");
		printf("------------10.遍历栈------------\n");
		printf("------------11.退出\n"); 
		printf("输入功能号:\n");
		scanf("%d",&functionNum);
		switch(functionNum){
			case 1:
				linkStack = initStack();
				printf("初始化成功!\n");
				display(linkStack); 
				break;
			case 2:
				destroyStack(linkStack);
				printf("销毁成功!\n");
				display(linkStack); 
				break;
			case 3:
				clearStack(linkStack);
				printf("栈已置空\n");
				display(linkStack); 
				break;
			case 4:
				if(stackEmpty(linkStack)){
					printf("栈空!\n");
				}else{
					printf("栈非空!\n");
				}
				break;
			case 5:
				if(stackFull(linkStack)){
					printf("栈满!\n");
				}else{
					printf("栈未满!\n");
				} 
				break;
			case 6:
				if(getTop(linkStack, topElem)){
					printf("栈顶元素是:%d\n",top);
				}else{
					printf("栈空!\n");
				}
				break;
			case 7:
				printf("输入要压入栈的值:\n");
				scanf("%d",&pushNum);
				if(push(linkStack,pushNum)){
					printf("压栈成功!\n");
					display(linkStack);
				}
				break;
			case 8:
				if(pop(linkStack,topElem)){
					printf("出栈成功,栈顶元素是:%d\n",*topElem);
				}
				break;
			case 9:
				printf("栈内元素个数:%d\n",stackLength(linkStack));
				break;
			case 10:
				display(linkStack);
				break;
			case 11:
				printf("感谢使用!\n");
				continueFlag = false; 
				break; 
			default:
				printf("功能号不存在!\n");
				break;
		}
	}
	return 0;
} 

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值