栈-操作受限的线性表
以下是顺序栈的一些基础操作实现
编译环境-Dev c++
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
/*栈:一个操作受限的线性表;
只允许在在线性表尾进行插入和删除;
约定可以删除和插入的一端称为栈顶,另一端称为栈底;
*/
//结构-顺序栈
#define InitStackSize 100
#define IncreaseSize 10
typedef struct{
int *top;//栈顶指针
int *rear;//栈底指针
int stackSize;//已分配空间大小
int length;//长度
}SqStack;
//初始化空栈
SqStack InitStack();
//入栈
void Push(SqStack &s,int e);
//出栈
void Pop(SqStack &s,int &e);
//判空
int StackEmpty(SqStack s);
//输出栈顶元素值
void PrintfTop(SqStack s);
//主函数如下
int main(){
SqStack s = InitStack();//初始化空栈;
//入栈
int e;
printf("入栈两次,输入入栈的元素值:");
scanf("%d",&e);
Push(s,e);//入栈
Push(s,e);
PrintfTop(s);//输出栈顶元素
//出栈
int a;
Pop(s,a);//出栈
printf("出栈元素值为:%d\n",a);
PrintfTop(s);//输出栈顶元素
//判空
int empty = StackEmpty(s);
if(!empty){
printf("栈s非空!!\n");
}
else{
printf("栈s为空栈!!\n");
}
//输出栈的基本信息
printf("栈的长度为%d,栈分配的总空间为%d,剩余可分配的空间为%d\n",s.length,s.stackSize,s.stackSize-s.length);
return 0;
}
//实现函数如下:
//初始化空栈
SqStack InitStack(){
SqStack p ;
if(!(p.rear = (int *) malloc (InitStackSize * sizeof(int)))){
printf("分配空间失败!!\n");
exit(1);
}
p.top = p.rear;
p.stackSize = InitStackSize;
p.length = 0;
return p;
}
//入栈
void Push(SqStack &s,int e){
//判栈是否满
if(s.top - s.rear > s.stackSize){
printf("栈满,进行追加空间!!\n");
if(!(s.rear = (int *) realloc (s.rear,(s.stackSize + IncreaseSize) * sizeof(int)))){
printf("空间追加失败!!\n");
return;
}
Sleep(2000);
printf("空间追加成功!!\n");
s.top = s.rear + s.stackSize;
s.stackSize += IncreaseSize;
}
*s.top = e;
*s.top++;
s.length++;
}
//出栈
void Pop(SqStack &s,int &e){
if(s.top == s.rear){
printf("栈空!!!");
exit(1);
}
e = *(s.top - 1);
*s.top--;
s.length--;
}
int StackEmpty(SqStack s){
if(s.top == s.rear) return 1;
else return 0;
}
//输出栈顶元素
void PrintfTop(SqStack s){
if(s.rear == s.top){
printf("栈为空!!\n");
exit(1);
}
printf("栈顶元素为:%d\n",*(s.top-1));
}