数据结构——顺序栈的基本操作

数据结构——顺序栈的基本操作

       顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到 栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。由于C语言中数组的下标是从0开始的,通常习惯的做法是:以top=-1 表示空栈。

顺序栈的定义如下:

#define MAXsize 100
#define ElementType int
typedef struct  {
	ElementType data[MAXsize];
	int top;
}SeqStack;

顺序栈的初始算法

SeqStack* InitStack(SeqStack* s) {					//生成空堆栈
	s = (SeqStack*)malloc(sizeof(SeqStack));
	if (s == NULL)
		printf("申请失败\n");
	else
		s->top = -1;
	return s;
}

判断栈是否满

int FullStack(SeqStack* s) {							//判断栈是否满
	if (s->top == MAXsize-1)
		return 1;
	else
		return 0;
}

判断栈是否为空

int EmptyStack(SeqStack* s) {						//判断栈为空
	if (s->top == -1)
		return 1;
	else
		return 0;
}

删除一个栈顶元素

ElementType Pop(SeqStack* s,ElementType *e) {						//在栈顶删除一个元素
	
	if (EmptyStack(s) == 1) {
		printf("栈为空,无法删除\n");
		return 0;
	}	
	else {
		*e = s->data[s->top];
		s->top--;
		return 1;
	}
}

在栈顶添加一个元素

void Push(SeqStack* s, ElementType x) {		//在栈顶插入一个元素
	if (FullStack(s) == 1)
		printf("栈已经满,无法插入\n");
	else{
		s->top++;
		s->data[s->top] = x;
		printf("加入栈成功\n");
	}
}

完整代码如下

#include <stdlib.h>
#include <stdio.h>
#define MAXsize 100
#define ElementType int
typedef struct  {
	ElementType data[MAXsize];
	int top;
}SeqStack;
SeqStack* InitStack(SeqStack* s) {					//生成空堆栈
	s = (SeqStack*)malloc(sizeof(SeqStack));
	if (s == NULL)
		printf("申请失败\n");
	else
		s->top = -1;
	return s;
}
int FullStack(SeqStack* s) {							//判断栈是否满
	if (s->top == MAXsize-1)
		return 1;
	else
		return 0;
}
void Push(SeqStack* s, ElementType x) {		//在栈顶插入一个元素
	if (FullStack(s) == 1)
		printf("栈已经满,无法插入\n");
	else{
		s->top++;
		s->data[s->top] = x;
		printf("加入栈成功\n");
	}
}
int EmptyStack(SeqStack* s) {						//判断栈为空
	if (s->top == -1)
		return 1;
	else
		return 0;
}
ElementType Pop(SeqStack* s,ElementType *e) {						//在栈顶删除一个元素
	
	if (EmptyStack(s) == 1) {
		printf("栈为空,无法删除\n");
		return 0;
	}	
	else {
		*e = s->data[s->top];
		s->top--;
		return 1;
	}
}



int main() {
	ElementType selector,x,k;
	int i,n,m;
	SeqStack* s;
	s = (SeqStack*)malloc(sizeof(SeqStack));
	printf("请输入要为栈添加多少个元素:");
	scanf("%d",& n);
	if (n > 100) {
		printf("添加的元素太多,请少于101,从新输入:");
		scanf("%d", &n);
	}
	else {
		printf("输入要添加的元素:");
		for (i = 0;i < n;i++) {
			scanf("%d", &s->data[i]);
		}
		s->top = n - 1;
		do {
			printf("1.创建栈\n");
			printf("2.判断栈是否为空\n");
			printf("3.判断栈是否满\n");
			printf("4.在栈顶删除一个元素\n");
			printf("5.在栈顶插入一个元素\n");
			printf("0.退出\n");
			printf("请输入你的选择:");
			scanf("%d", &selector);
			switch (selector) {
			case 1:
				InitStack(s);
				break;
			case 2:
				m = EmptyStack(s);
				if (m == 1)
					printf("该栈为空\n");
				else
					printf("该栈不为空\n");
				break;
			case  3:
				 m= FullStack(s);
				if (m == 1)
					printf("栈满\n");
				else
					printf("栈未满\n");
				break;
			case 4:
				Pop(s,&k);
				break;
			case 5:
				printf("输入要添加的元素:");
				scanf("%d", &x);
				Push(s,x);
				break;
			default:
				printf("选择错误\n");
			}
		} while (selector != 0);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值