本片博客主要是顺序栈的基本操作,包含以下内容:
初始化
入栈
出栈
判空
判满
返回栈顶元素(栈顶元素不出栈)
返回栈顶元素(栈顶元素出栈)
顺序栈的初始化:
初始化顺序栈时只需要让栈顶等零
void InitStack (Stack *p) //初始化
{
assert (p != NULL);
p->top = 0;
}
入栈
入栈时,将元素的值赋在top的位置,在让top++
void PushStack (Stack *p, DataType d) //入栈
{
assert (p);
if (p->top == MAXSIZE)
{
printf ("栈满,无法入栈!!!\n");
return;
}
p->data[p->top++] = d;
}
出栈:
出栈时只需要将top-1
void PopStack (Stack *p)//出栈
{
assert (p);
if (p->top == 0)
{
printf ("栈空,操作失败!!!\n");
return;
}
p->top --;
}
返回栈顶元素(栈顶元素不出栈):
返回栈顶元素,top的值不变
DataType TopNum (Stack *p) //返回栈顶元素(不出栈)
{
if (p->top == 0)
{
printf ("栈为空!!\n");
return 0;
}
return p->data[(p->top)-1];
}
返回栈顶元素(栈顶元素出栈):
返回top的值之后让top-1
DataType TopNumAndTop (Stack *p) //返回栈顶元素(出栈)
{
if (p->top == 0)
{
printf ("栈为空!!\n");
return 0;
}
return p->data[--(p->top)];
}
判断栈是否为空(为空,返回1;如果不为空,返回0):
int IsEmpty (Stack *p) // 判空
{
return (p->top == 0);//如果为空,返回1;如果不为空,返回0
}
判断栈是否已满(满了返回1,未满返回0)
int IsFull (Stack *p) //判满
{
return (p->top == MAXSIZE);//如果栈满 返回1;否则返回0
}
这里是对应的头文件statck.h:
# ifndef __stack_h__
# define __stack_h__
#include <assert.h>
#include <stdio.h>
#define MAXSIZE 30
//typedef char DataType ;
typedef int DataType ;
typedef struct STACK
{
int top ; //栈顶
DataType data[MAXSIZE]; //数据
}Stack;
void InitStack (Stack *p); //初始化
void PushStack (Stack *p, DataType d); //入栈
void PopStack (Stack *p); // 出栈
int IsEmpty (Stack *p); // 判空
int IsFull (Stack *p); //判满
DataType TopNum (Stack *p); //返回栈顶元素(不出栈)
DataType TopNumAndTop (Stack *p); //返回栈顶元素然后出栈
# endif
功能测试:
#include "statck.h"
void test1()
{
int ret = -1;
Stack stack;
InitStack (&stack);
ret = IsEmpty (&stack);
if (ret)
printf ("栈为空\n");
else
printf ("栈不为空\n");
ret = IsFull (&stack);
if (ret)
printf ("栈满\n");
else
printf ("栈不满\n");
//入栈
PushStack(&stack, 1);
PushStack(&stack, 2);
PushStack(&stack, 3);
PushStack(&stack, 4);
ret = IsEmpty (&stack);
if (ret)
printf ("栈为空\n");
else
printf ("栈不为空\n");
ret = IsFull (&stack);
if (ret)
printf ("栈满\n");
else
printf ("栈不满\n");
//出栈
PopStack (&stack);
PopStack (&stack);
ret = IsEmpty (&stack);
if (ret)
printf ("栈为空\n");
else
printf ("栈不为空\n");
ret = IsFull (&stack);
if (ret)
printf ("栈满\n");
else
printf ("栈不满\n");
PopStack (&stack);
PopStack (&stack);
ret = IsEmpty (&stack);
if (ret)
printf ("栈为空\n");
else
printf ("栈不为空\n");
ret = IsFull (&stack);
if (ret)
printf ("栈满\n");
else
printf ("栈不满\n");
}
void test2()
{
DataType ret = -1;
Stack stack;
InitStack (&stack);
ret = TopNum (&stack);
printf ("%d\n", ret);
//入栈
PushStack(&stack, 1);
PushStack(&stack, 2);
PushStack(&stack, 3);
PushStack(&stack, 4);
ret = TopNum (&stack);
printf ("%d\n", ret);
}
void test3()
{
DataType ret = -1;
Stack stack;
InitStack (&stack);
ret = TopNumAndTop (&stack);
printf ("%d\n", ret);
//入栈
PushStack(&stack, 'a');
PushStack(&stack, 'b');
PushStack(&stack, '4');
PushStack(&stack, 'd');
ret = TopNumAndTop (&stack);
printf ("%c\n", ret);
}
int main ()
{
// test1();
// test2();
test3();
return 0;
}