顺序栈的建立及基本操作
栈的定义
栈是一种只能在一端进行插入和删除操作的线性表。其中允许进行插入和删除操作的一段称为栈顶(Top)。对于顺序栈,就是记录栈顶元素所在数组位置标号的一个整型变量;对于链式栈,就是记录栈顶元素所在节点地址的指针,其中它是动态变化的。表的另一端称为栈底,栈底是固定不变的。栈的插入和删除操作一般称为入栈和出栈。
栈的特点
栈的主要特点就是先进后出(FILO)。如同一个开进死胡同的车队,最先进去的最后才能出来。
栈的存储结构
线性表的存储结构分为顺序表和链表,栈也有相同的存储结构 :顺序栈跟链栈。本博客主要介绍顺序栈。
栈的数学性质
当n个元素以某种顺序依次进栈,并且可以在任意时刻出栈(在满足先进后出的前提下)时,所获得的元素排列数目N恰好满足函数Catalan()的计算,即:C(2n,n)/(n+1)。
顺序栈
在考研的过程中对于顺序栈有做要求,主要是对它的四个要素进行考察,这四个要素包括两个特殊状态和两个操作。
几个要素
1.栈空状态:st.top == -1。有的将栈空状态规定为st.top == 0,没有实质上的影响,具体看题目要求。
2.栈满状态:st.top == maxSize -1。其中maxSize表示栈中最大元素个数,则maxSize-1为栈满时栈顶元素在数组中的位置,因为数组下标从0开始。注:我们是将top为-1时为栈空,即top == 0的数组位置是有元素的。
3.非法状态:栈满时继续入栈会上溢,栈空时继续出栈会下溢。
两个操作:
1.入栈:因为我们设置top在-1位置,所以我们应该先移动指针再写入元素++(st.top);st.data[st.top] = inNum;
2.出栈:出栈应该先取出元素,再移动指针outNum = st.data[st.top];--st.top;
以下就是对于顺序栈的具体操作:
首先我们对顺序栈进行定义
//顺序栈定义
typedef struct
{
datatype data[maxsize];
int top;
}SqStack,*SqueStack;
然后是对其进行初始化操作
void initStack(SqStack &st)
{
st.top = -1;
}
接着就是入栈操作
int Push_SqStack(SqStack &st)
{
int inNum;
printf("请输入你需要写入的元素(输入0的时候输入结束):\n");
do
{
scanf("%d", &inNum);
++(st.top);
st.data[st.top] = inNum;
} while (inNum!=0);
printf("顺序栈建立成功!\n");
return OK;
}
出栈
int Pop_SqStack(SqStack st)
{
int outNum;
do
{
if (st.top <= -1)
{
printf("出栈完全!");
return NULL;
}
else
{
outNum = st.data[st.top];
printf("删除的栈顶元素是%d\n", outNum);
--st.top;
}
} while (st.top>-1);
}
主函数
int main()
{
SqStack *S;
S = (SqueStack)malloc(sizeof(SqStack));
initStack(*S);
Push_SqStack(*S);
Pop_SqStack(*S);
system("pause");
return EXIT_SUCCESS;
}
代码也就全部展现在上面,没有什么难点,仔细分析还是可以理解的。下面是一些补充的内容:
//判断栈空
int isEmpty(SqStack st)
{
if (st.top == -1)
{
return 1;
}
else
return 0;
}
//进栈操作
int push(SqStack &st, int x)
{
if (st.top == maxsize-1) //栈满不能进栈
{
return 0;
}
++(st.top); //先移动指针再进栈
st.data[st.top] = x;
return 1;
}
//出栈操作
int pop(SqStack &st,int &x)
{
if (st.top == 1) //栈为空不能出栈
{
return 0;
}
x = st.data[st.top]; //先取出元素再移动指针
--(st.top);
return 1;
}
我是CSDN实习三个半月的 "个人练习生"