栈(ADT)的定义以及基本操作(使用进制转化为例)

栈模型

栈(stack)是限制插人和删除只能在一个位置上进行的表,该位置是表的未端,叫做栈的顶(top)。对栈的基本操作有Push(进栈)和Pop(出栈),前者相当于插入,后者则是删除最后插入的元素。最后插入的元素可以通过使用Top例程在执行Pop之前进行考查。对空栈进行的Pop或Top一般被认为是栈ADT的错误。另一方面,当运行Push时空间用尽是一个实现错误,但不是ADT错误。(所以在运行Push以及Pop和Top时,应判断栈是否空和申请空间是否成功)
图1. 栈模型: 通过Push向栈输入,通过Pop从栈输出

栈有时又叫做LIFO(后进先出)表。在图1中描述的模型只象征着Push是输入操作而Pop和Top是输出操作。对栈可以做的事,基本上也就是Push和Pop操作。
存在某个元素位于栈顶,而该元素是唯一可见的元素,即Top操作取得的元素。

栈的实现

链表实现

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

#define ElementType int
#define Error(Str) fprintf(stderr,"%s\n",Str),exit(1)

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int IsEmpty(Stack S);//测试栈是否是空栈
Stack CreateStack( void );//创建一个空栈
void DisposeStack( Stack S );//销毁栈
void MakeEmpty( Stack S );//置空表
void Push ( ElementType X,Stack S );//入栈
ElementType Top ( Stack S );//获取栈顶元素
void Pop( Stack S );//出栈
void DecadeToOther(int a,int b);//进制转换

struct Node
{
   
	ElementType Element;
	PtrToNode Next;
};
int main()
{
   
	int a,b;
	printf("请输入十进制数:");
	scanf("%d",&a);
	printf("请输入要转化的进制:");
	scanf("%d",&b);
	printf("转化后的数:");
	DecadeToOther(a,b);	
	return 0;
}

int
IsEmpty(Stack S)
{
   
	return S->Next == NULL;
}

Stack
CreateStack( void )
{
   
	Stack S;
	
	S = malloc ( sizeof ( struct Node ) );//这里不要强制性转化,因为malloc会自动转化会对应的指针类型
	if ( S == NULL )
		Error
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值