栈的基本操作
1.栈的定义:
- 栈是限定仅在表尾进行插入或者删除操作的线性表;
- 对栈来说,可以分为栈顶(top)和栈底(bottom)之分;
- 栈又称为后进先出的顺序表;
2.顺序栈的表示
- 顺序栈的定义
#define MAXSIZE 100
typedef struct{
int stacksize; //栈可用的最大容量
SElemType *top; //栈顶指针
SElemType *base; //栈底指针
}SqStack;
- 顺序栈的初始化
Status InitStack(SqStack &s){
s.base=new SElemType[MAXSIZE];
if(!s.base==NULL) exit(OVERFLOW);
s.top=s.base;
s.stacksize=MAXSIZE;
return OK;
}
- 顺序栈的入栈
Status Push(SqStack &S,SElemType e){
if(S.top-S.base==S.stacksize) return ERROR;//栈空
*S.top++=e; //元素e压入栈顶,栈顶指针加一(*S.top=e;S.top++;)
return OK;
}
- 顺序栈的出栈
Status Pop(SqStack &S,SElemType &e){
if(S.top==S.base) return ERROR;//栈空
e=*--S.top; //栈顶指针减一,将栈顶元素赋给e
return OK;
}
顺序栈的实现
#include<stdlib.h>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;
typedef int keytype;
typedef int infotypr;
#define MAXSIZE 100
typedef struct {
int stacksize; //栈可用的最大容量
SElemType* top; //栈顶指针
SElemType* base; //栈底指针
}SqStack;
Status InitStack(SqStack &s) {
s.base = new SElemType[MAXSIZE];
if(!s.base)exit(OVERFLOW);
s.top = s.base;
s.stacksize = MAXSIZE;
return OK;
}
Status Push(SqStack& S, SElemType e) {
if (S.top - S.base == S.stacksize) return ERROR;//栈空
*S.top++ = e; //元素e压入栈顶,栈顶指针加一(*S.top=e;S.top++;)
return OK;
}
Status Pop(SqStack& S, SElemType& e) {
if (S.top == S.base) return ERROR;//栈空
e = *--S.top; //栈顶指针减一,将栈顶元素赋给e
return OK;
}
int main() {
SqStack S;
int N,e;
cout << "请输入入栈元素个数N:";
cin >> N;
InitStack(S);
cout << "请输入元素:";
for (int i = 0; i < N; i++) {
cin >>e;
Push(S, e);
}
while (S.top != S.base) {
Pop(S,e);
cout << e << " ";
}
return 0;
}
3.链栈的表示
1.链栈的存储结构
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
- 链栈的初始化`
Status InitStack(LinkStack &S){
S=NUll;
return OK;
}
- 链栈的入栈
Status Push(LinkStack &S,SElemType e){ //在栈顶插入元素
LinkStack p;
p=new StackNode;//生成新的结点
p->data=e;//将新结点的数据域置为e
p->next=S;//将新结点插入栈顶
S=p;//修改栈顶指针为p
return Ok;
}
- 链栈的出栈
Status Push(LinkStack &S,SElemType e){
LinkStack p;
if(S==NULL) return ERROR;//栈空
e=S->date;
p=S;
S=S->next;
delet p;
return OK;
}
- 取栈顶元素
SElemType GetTop(LinkStack S){
if(S!=NULL)//栈非空
return S->date;//返回栈顶元素的值,栈顶指针不变
}