一、栈
栈是一种限定性线性表,是将线性表的插入和删除运算限制为仅在表的一端进行。通常将线性表中允许进行插入删除操作的一端称为栈顶(Top),因此栈顶的当前位置是动态变化的。
二、代码
1.头文件与宏定义
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
#define StackElemType char
2.对栈的定义及主要操作
typedef struct {
StackElemType elem[Stack_Size];
int top; //元素栈顶的下标
}SeqStack;
// 初始化栈
void InitStack(SeqStack* S) {
S->top = -1; //构造一个空栈
}
//判断栈空
int IsEmpty(SeqStack* S) {
return (S->top == -1 ? TRUE : FALSE);
}
//判断栈满
int IsFull(SeqStack* S) {
return (S->top == Stack_Size - 1 ? TRUE : FALSE);
}
//进栈
int Push(SeqStack* S, StackElemType x) {
//栈满
if (S->top == Stack_Size-1 )
return FALSE;
else {
S->top++;
S->elem[S->top] = x;
return OK;
}
}
//出栈
int Pop(SeqStack* S, StackElemType* x) {
//栈空
if (S->top == -1)
return FALSE;
else {
*x = S->elem[S->top];
S->top--;
return OK;
}
}
//取栈顶元素
int GetTop(SeqStack* S, StackElemType* x) {
//栈空
if (S->top == -1)
return FALSE;
else {
*x = S->elem[S->top];
return OK;
}
}
//输出栈的长度
int LenStack(SeqStack S) {
return (S.top + 1);
}
//输出从栈顶到栈底的元素
int PrintStack(SeqStack S){
//栈空
//函数中没有使用指针,S.top不受影响
if (S.top == -1)
return FALSE;
else {
while (TRUE) {
printf("%c ", S.elem[S.top--]);
if (S.top == -1)
break;
}
return OK;
}
}
3.主函数(测试函数)
int main() {
SeqStack S;
StackElemType x;
int i, n, len;
int flag; //判断操作是否成功
//初始化栈
InitStack(&S);
//判断栈是否为空
printf("判断栈是否为空:");
flag = IsEmpty(&S);
if (flag) {
printf(" 当前栈为空\n");
}
else {
printf(" 当前栈不为空\n");
}
//入栈
printf("请输入进栈元素个数:");
scanf("%d", &n);
getchar(); //回车
printf("请输入元素:\n");
for (i = 0; i < n; i++) {
x = getchar();
getchar();
flag = Push(&S, x);
if (!flag){
printf("栈满!!");
break;
}
}
//判断栈是否为空
printf("判断栈是否为空:");
flag = IsEmpty(&S);
if (flag) {
printf(" 当前栈为空\n");
}
else {
printf(" 当前栈不为空\n");
}
//栈的长度
len = LenStack(S);
printf("栈的长度为:%d\n", len);
//输出栈顶元素
flag = GetTop(&S, &x);
printf("当前栈顶元素:%c\n", x);
//输出从栈顶到栈底的元素
printf("从栈顶到栈底的元素:");
PrintStack(S);
printf("\n");
//出栈
printf("出栈:");
flag = TRUE;
while (flag) {
flag = Pop(&S, &x);
if (!flag) {
break;
}
else {
printf("%c ", x);
}
}
printf("\n");
//判断栈是否为空
printf("判断栈是否为空:");
flag = IsEmpty(&S);
if (flag) {
printf(" 当前栈为空\n");
}
else {
printf(" 当前栈不为空\n");
}
return 0;
}