栈是限定仅在表尾进行插入和删除操作的线性表。
栈的抽象数据类型
ADT 栈(stack)
Data
同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系
Operation
InitStack(*S):初始化操作,建立一个空栈S
ClearStack(*S):将栈清空
StackEmpty(S):若栈为空,返回true,否则返回false
GetTop(*S,*e):若栈存在且非空,用e返回S的栈顶元素
Push(*S,e):若栈存在,插入新元素e到栈S中并成为栈顶元素
Pop(*S,*e):删除栈S中栈顶元素,并用e返回其值
StackTraverse(*S):遍历栈中所有元素
StackLength(S):返回栈S的元素个数
endADT
代码如下:(编译软件VS2017)
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /*存储空间初始分配量*/
typedef int Status;
typedef int SElemType;//SElemType类型根据实际情况而定,这里假设为int
//顺序栈结构
typedef struct
{
SElemType data[MAXSIZE];
int top;//用于栈顶指针
}SqStack;
Status visit(SElemType c)
{
printf("%d", c);
return OK;
}
//构造一个空栈s
Status InitStack(SqStack *s)
{
//S.data=(SElem TYpe*)malloc(MAXSIZE*sizeof(SElemType);
s->top = -1;
return OK;
}
//把S置为空栈
Status ClearStack(SqStack *s)
{
s->top = -1;
return OK;
}
//若栈S为空栈,则返回TRUE,否则返回FALSE
Status StackEmpty(SqStack s)
{
if (s.top == -1)
return TRUE;
else
return FALSE;
}
//返回s的元素个数,即栈的长度
int StackLength(SqStack S)
{
return S.top + 1;
}
//若栈不为空,即用e返回S的栈顶元素,并返回OK,否则返回ERROR
Status GetTop(SqStack S, SElemType *e)
{
if (S.top == -1)
return ERROR;
else
{
*e=S.data[S.top];
return OK;
}
}
//插入元素e为新的栈顶元素
Status Push(SqStack *S, SElemType e)
{
if (S->top == MAXSIZE - 1)//栈满
return ERROR;
S->top++;
S->data[S->top] = e;
return OK;
}
//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack *S, SElemType *e)
{
if (S->top == -1)
return ERROR;
else
{
*e = S->data[S->top];
S->top--;
return OK;
}
}
//从栈底到栈顶依次对栈中每个元素显示
Status StackTraverse(SqStack S)
{
int i=0;
while (i <= S.top)
{
visit(S.data[i++]);
}
printf("\n");
return OK;
}
int main()
{
int j;
SqStack s;
int e;
if (InitStack(&s) == OK)
for (j = 1; j <= 10; j++)
Push(&s, j);
printf("栈中元素依次为:");
StackTraverse(s);
Pop(&s, &e);
printf("弹出的栈顶元素 e=%d\n", e);
GetTop(s, &e);
printf("栈空否:%d(1.空 0:空)\n", StackEmpty(s));
ClearStack(&s);
printf("清空栈后,栈空否:%d(1:空 0:否)\n", StackEmpty(s));
system("pause");
return 0;
}
结果截图如下:
在编译的过程中遇到问题:MSB6006“link.exe”已退出,代码为 1561。顺序栈
是因为软件的问题,可以用DirectX修复工具在线修复版,下载地址:https://www.weidown.com/xiazai/1478.html
栈是限定仅在表尾进行插入和删除操作的线性表。