栈分为两种,一种是顺序栈,一种是链栈。两种都是线性表的结构。
栈是比较特殊的一种线性表,只能在一端插入或是删除数据。只能插入和删除数据的一端为栈顶,而固定不变的是栈底。
栈完全符合先进后出(后进先出)的规则。
向栈中插入数据,叫做入栈(push)。
从栈中取出数据,叫做出栈(pop)。
两种情况下均是移动栈顶指针。
#include <stdio.h>
#define MaxSize 30
typedef int ElemType;
typedef struct {
int data[MaxSize]; //数据
int top; //栈顶
}SeqStack; //线性表,顺序栈定义
void initSeqStack(SeqStack &st);
int pushSeqStack(SeqStack &st, int x);
int popSeqStack(SeqStack &st, int &x);
bool isEmpty(SeqStack &st);
void initSeqStack(SeqStack &st) {
st.top = -1;
}
/*入栈函数,先移动栈顶指针,再入栈数据*/
int pushSeqStack(SeqStack &st, int x) {
if (st.top == MaxSize - 1)
return 0; //SeqStack已满,不能入栈
else {
++st.top;
st.data[st.top] = x;
return 1;
}
}
/*出栈函数,先将数据取出,再移动栈顶指针*/
int popSeqStack(SeqStack &st, int &x) {
if (st.top == -1)
return 0; //SeqStack已空,没有数据可以出栈
else {
x = st.data[st.top];
--st.top;
return 1;
}
}
/*判断顺序栈是否为空*/
bool isEmpty(SeqStack &st) {
if (st.top == -1) {
return true;
}else {
return false;
}
}
/*返回栈中元素的个数*/
int size(SeqStack &st) {
return st.top + 1;
}
int main()
{
SeqStack st;
initSeqStack(st);
ElemType a = 1;
pushSeqStack(st, a);
printf("%d push stack\n", a);
pushSeqStack(st, 2);
printf("%d push stack\n", 2);
pushSeqStack(st, 3);
printf("%d push stack\n", 3);
printf("pop element from stack\n");
while (!isEmpty(st)) {
printf("size of stack is %d\n", size(st));
ElemType temp = 0;
popSeqStack(st, temp);
printf("pop element is %d\n", temp);
}
printf("\n");
getchar();
return 0;
}