顺序栈特点:FILO(先进后出)
计算顺序栈的长度方法:length=s.top-s.base;
时间复杂度:O(1)
#include <stdio.h>
#include <iostream>
using namespace std;
#define sElemType int //预定义类型
#define STACK_INIT_SIZE 10 //预定义初始容量
//定义顺序栈的结构体
typedef struct sqStack{
sElemType *top;//栈顶指针(指向栈顶元素的下一个元素的地址)
sElemType *base;//保存顺序栈的数组的首地址,也就是数组的名字(作用:判空)
int size;//容量
};
//初始化栈
void initStack(sqStack &s){
s.top=s.base=new sElemType[STACK_INIT_SIZE];//申请一段连续空间存放栈元素
s.size=STACK_INIT_SIZE;
}
//判空
int isEmpty(sqStack s) {
return s.base==s.top;
//栈空返回1;栈非空返回0
}
//压栈
void push(sqStack &s,sElemType val){
if(s.top-s.base==s.size){
cout<<"栈已满,无法继续压入元素"<<endl;
return;
}
*s.top=val;
s.top++;
}
//打印栈顶元素
void printTop(sqStack s){
cout<<"当前栈顶的元素是:"<<*(s.top-1)<<endl;
}
//弹栈
void pop(sqStack &s,sElemType &val){
if(isEmpty(s)){
cout<<"栈已空,无法再弹出元素"<<endl;
return;
}
s.top--;
val=*s.top;
}
//压栈全部容量的元素
void pushAll(sqStack &s){
sElemType accum=1;//累加器
sElemType val;//压入栈的元素
while(s.top-s.base!=s.size){
cout<<"请输入第"<<accum<<"个元素进行压栈"<<endl;
scanf("%d",&val);
push(s,val);
printTop(s);
accum++;
}
cout<<"栈已满,无法再压入元素"<<endl;
return;
}
//弹栈全部容量的元素
void popAll(sqStack &s){
sElemType accum=1;//累加器
sElemType val;//弹出栈的元素
//当栈非空时
while(!isEmpty(s)){
pop(s,val);
cout<<"该栈中被弹出的第" <<accum<<"个元素为:"<<val<<endl;
accum++;
}
cout<<"栈已空,无法再弹出元素"<<endl;
return;
}
int main(){
//栈s1测试压栈和弹栈全部容量的元素的功能
sqStack s1;
initStack(s1);
pushAll(s1);
popAll(s1);
printTop(s1);
//栈s2测试压栈和弹栈一个元素的功能
sqStack s2;
push(s2,11);
printTop(s2);
push(s2,22);
printTop(s2);
sElemType val;
pop(s2,val);
cout<<"栈中被弹出的元素为:"<<val<<endl;
return 0;
} 在这里插入代码片
运行结果截图: