栈模型
栈(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