一、顺序结构存储
#include<stdio.h>
#define maxSize 100
/*顺序结构存储栈:一个数组、一个位置指示器*/
typedef struct {
int data[maxSize];
int top; // 位置指示器
}SqStack;
/*入栈:1、位置指示器top加1;2、进入元素*/
void push(SqStack *st, int x){
if (st->top == maxSize - 1) {
printf("栈为满!");
return -1;
}
st->top++;
st->data[st->top] = x;
}
/*出栈:1、先取出要出栈的元素;2、位置指示器top减一*/
void pop(SqStack *st, int *y) {
if (st->top == -1) {
printf("栈为空!");
return -1;
}
*y = st->data[st->top];
st->top--;
}
int main(void) {
SqStack st;
int N, M, x, y;
st.top = -1; // 初始化位置指示器为-1,代表此时栈中无元素(空栈)
scanf("%d %d", &N, &M); // N是进栈元素的个数,M是出栈的元素个数
for (int i = 0; i < N; i++) {
scanf("%d", &x);
push(&st, x);
}
printf("进栈的元素为:");
for (int i = 0; i < N; i++) {
printf("%d ", st.data[i]);
}
printf("\n");
printf("出栈的元素为:");
for (int i = 0; i < M; i++) {
pop(&st, &y);
printf("%d ", y);
}
printf("\n剩下的元素为:");
for (int i = 0; i < N - M; i++) {
printf("%d ", st.data[i]);
}
return 0;
}
二、链栈存储
/*栈顶指针应在链头*/
#include<stdio.h>
#include<stdlib.h>
/* 定义结点:一个数据域;一个指针域 */
struct SNode {
int Data;
struct SNode *Next;
};
typedef struct SNode *Stack;
/* 构建一个堆栈的头结点,返回指针 */
Stack CreakStack()
{
Stack S;
S = (Stack)malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}
/* 将元素item压入堆栈S,放入头结点的后面,由于是链表,所以push操作不需要考虑是否满*/
void push(Stack S, int item)
{
Stack TmpCell;
TmpCell = (Stack)malloc(sizeof(struct SNode));
TmpCell->Data = item;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
/* 删除并返回堆栈S的栈顶元素,删除元素需判断是否为空栈 */
int pop(Stack S) {
Stack FirstCell;
int TopElem;
if (IsEmpty(S)) {
printf("堆为空");
return 0;
}
else {
FirstCell = S->Next;
S->Next = FirstCell->Next;
TopElem = FirstCell->Data;
free(FirstCell);
return TopElem;
}
}
/* 判断堆栈S是否为空,若为空函数返回整数1,否则返回整数0 */
int IsEmpty(Stack S)
{
return (S->Next == NULL);
}
int main(void) {
Stack S = CreakStack();
int N, M, x, y;
scanf("%d %d", &N,&M);
printf("入栈元素为:");
for (int i = 0; i < N; i++) {
scanf("%d", &x);
push(S, x);
}
printf("出栈元素为:");
for (int i = 0; i < M; i++) {
printf("%d ", pop(S));
}
return 0;
}