顺序栈及其基本操作
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
using namespace std;
#define STACK_INIT_SIZE 100
#define ElemType int
/*
栈的三种有用操作
1.获取栈顶元素
2.入栈
3.出栈
*/
//Elemtype代表某一不确定类型
typedef struct
{
int *bottom;
int *top;
int stackSize;
}sqStack;
/* 关于栈的一些基本操作 */
void initStack(sqStack &s); //创造空栈
ElemType GetTop(sqStack &s); //获取栈顶元素
bool Isempty(sqStack &s); //是否空栈
void cleanStack(sqStack &s); //清空栈
void destroyStack(sqStack &s); //销毁栈
void push_stack(sqStack &s, int e); //入栈操作
ElemType pop_stack(sqStack &s, ElemType *e); //出栈操作
ElemType Stack_length(sqStack &s); //栈的长度
void StackTraverse(sqStack &s); //栈的遍历
int main()
{
sqStack S;
initStack(S); //构造一个空栈
ElemType i, n;
cout << "...输入栈的长度: ";
cin >> n;
/* 栈顶指针指向栈顶元素 还是 栈顶元素的上一个位置。就在下面由自己决定*/
for (i = 1; i <= n; i++){
printf("...输入栈的第%d个元素: ",i);
++S.top;
cin >> *(S.top - 1); //这就是栈顶元素,注意是在栈顶指针的下一个内存
}
/* 判断 */
if (Isempty(S)) {
cout << "...不是空栈" << endl << endl;
}
else {
cout << "...这确实是个空栈" << endl << endl;
}
/* 长度 */
int m;
cout << "...栈的长度是: " << Stack_length(S) << endl << endl;
/* 遍历 */
cout << "...遍历栈 " << endl;
StackTraverse(S);
cout << endl;
/* 获取栈顶元素 */
cout << "...获取栈顶元素: " << GetTop(S) << endl << endl;
/* 插入 */
int insert;
cout << endl << "...插入元素: ";
cin >> insert;
push_stack(S, insert);
cout << "...插入后...遍历栈 " << endl;
StackTraverse(S);
Sleep(1000);
/* 删除 */
ElemType delet;
cout << endl << "...删除栈顶元素: " << endl;
pop_stack(S, &delet);
cout << "...被删除的元素是: " << delet << endl << endl;
cout << "...删除后遍历栈 " << endl;
StackTraverse(S);
Sleep(1000);
/* 销毁栈 */
cout << endl << "...销毁栈的内存空间: " << endl;
destroyStack(S);
Sleep(1000);
system("pause");
return 0;
}
/**************一些函数的实现***************/
ElemType Stack_length(sqStack &s) {
return (s.top - s.bottom);
}
void StackTraverse(sqStack &s){
if (s.bottom == NULL){
exit(-1);
}
if (s.top == s.bottom){
cout << "...这是个空栈" << endl;
}
ElemType *p = s.top;
while (p > s.bottom){ //还没到达栈底
--p; //访问栈顶元素(即栈顶指针所指的下一个内存)
cout << *p << endl;
}
}
/*
与入栈操作相反地,出栈操作不需要进行内存的判别,
只需要先将栈顶指针下移,接着用int类型的变量e返回栈顶元素的值即可.
*/
ElemType pop_stack(sqStack &s, ElemType *e){
if (s.top == s.bottom){
return ERROR;
}
else{
--s.top; //通过e返回栈顶元素
*e = *s.top; //实际上此元素并没真正删除,仍在s.top中,但是如果插入元素,就会被更新
return *e;
}
}
void push_stack(sqStack &s, int e){
int incresize;
if (s.top - s.bottom > STACK_INIT_SIZE){ //判断栈是否溢出
cout << "...你想扩充的内存大小是: ";
cin >> incresize;
s.bottom = (int*)realloc(s.bottom, (s.stackSize + incresize) * sizeof(ElemType)); //在原先内存基础上再扩充increase
s.top = s.bottom + s.stackSize;
s.stackSize += incresize;
}
*(s.top++) = e; //栈顶指针上移一位,让数据e入栈,注意顺序不能颠倒,否则栈顶指针就不熟指向栈顶元素前一位了
}
void destroyStack(sqStack &s){
s.top = NULL;
s.stackSize = 0;
free(s.bottom);
s.bottom = NULL;
cout << "...销毁完毕" << endl;
}
void cleanStack(sqStack &s){
s.top = s.bottom;
}
bool Isempty(sqStack &s){
return (s.bottom != s.top);
}
ElemType GetTop(sqStack &s){
if (s.top != s.bottom)
{
return *(s.top - 1); //栈顶指针指向的下一个位置
}
}
void initStack(sqStack &s){
s.bottom = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!s.bottom){
cout << "...分配内存失败" << endl;
exit(0);
}
else{
cout << "...create successfully!" << endl << endl;
s.top = s.bottom; //创造空栈
s.stackSize = STACK_INIT_SIZE;
}
}
**
实现效果如下
**