一、main
#include <iostream>
#include "com.h"
using namespace std ;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv)
{
SqStack S ;
SElemType e ;
int choice , n , i , number , j = 0;
do
{
printf("\t\t\t==================================================\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 顺序栈基本操作 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t|================================================|\n");
printf("\t\t\t| 请选择要操作的命令 |\n");
printf("\t\t\t|------------------------------------------------|\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 0.退出整个系统 1.初始化栈 |\n");
printf("\t\t\t| 2.初始输入元素 3.栈是否为空 |\n");
printf("\t\t\t| 4.查看栈的长度 5.取栈顶元素 |\n");
printf("\t\t\t| 6.入栈 7.出栈 |\n");
printf("\t\t\t| 8.遍历栈 9.清空栈 |\n");
printf("\t\t\t| 10.销毁栈 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t==================================================\n");
printf("选择(0---9):\t");
cin >> choice ;
switch(choice)
{
case 0 :
cout << "退出成功" ;
cout << endl ;
exit(0) ;
case 1 :// 1.初始化栈
InitStack(S) ;
cout << "初始化栈成功" ;
cout << endl ;
break ;
case 2 : //2.初始输入元素
cout << "请输入需要入栈的数据个数:" ;
cin >> n ;
cout << "请输入需要入栈的"<<n<<"个数据,用空格隔开:"<<endl ;
for(i = 1 ; i <= n ; i ++)
{
cin >> number ;
Push(S , number) ;
}
cout << endl ;
break ;
case 3 : // 3.栈是否为空
if(StackEmpty(S)) cout << "该栈是空栈" ;
else cout << "该栈不是空栈" ;
cout << endl ;
break ;
case 4 : //4.查看栈的长度
cout << "该栈的长度 " << StackLength(S) ;
cout << endl ;
break ;
case 5 : //5.取栈顶元素
cout << "栈中元素为:" ;
if(StackTraverse(S) == ERROR) cout << "空栈" ;
cout << endl ;
if(GetTop(S , e) == ERROR) cout << "该栈为空,操作失败";
else cout << "栈顶元素为 " << e ;
cout << endl ;
break ;
case 6 : // 6.入栈
cout << "请输入入栈元素:" ;
cin >> number ;
if(Push(S , number) == ERROR) cout << "栈已满,入栈失败" ;
else cout << "入栈成功" ;
cout << endl ;
cout << "栈中元素为:" ;
if(StackTraverse(S) == ERROR) cout << "空栈" ;
cout << endl ;
break ;
case 7 : // 8 出栈
if(Pop(S , e) == ERROR) cout << "该栈为空,操作失败" ;
else cout << "栈顶元素 " << e << " 已出栈" ;
cout << endl ;
cout << "栈中元素为:" ;
if(StackTraverse(S) == ERROR) cout << "空栈" ;
cout << endl ;
break ;
case 8 : // 9遍历
cout << "栈中元素为:" ;
if(StackTraverse(S) == ERROR) cout << "空栈" ;
cout << endl ;
break ;
case 9 : // 清空栈
if(ClearStack(S) == OK) cout << "该栈已被清空" ;
cout << endl ;
break ;
case 10 : // 销毁栈
if(DestroyStack(S) == OK) cout << "该栈已被销毁" ;
cout << endl ;
break ;
default :
cout << "输入不合法,请重新输入" ;
cout << endl ;
}
}while(choice != 0) ;
return 0;
}
二、function
#include <stdlib.h>
#include "com.h"
#include <iostream>
using namespace std;
// 1、初始化
Status InitStack(SqStack &S)
{
// S.base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType)) ;
S.base = new SElemType[MAXSIZE] ;
if(!S.base) return OVERFLOW ;
S.top = S.base ;
S.stacksize = MAXSIZE ;
return OK ;
}
// 判空
Status StackEmpty(SqStack S)
{
if(S.top == S.base) return 1 ; //空
else return 0 ; // 非空
}
//求栈长度
int StackLength(SqStack S)
{
return S.top - S.base ;
}
// 取栈顶
Status GetTop(SqStack S , SElemType &e)
{
if(S.top == S.base) return ERROR ; //空表
e = *(S.top - 1) ;
return OK ;
}
// 入栈
Status Push(SqStack &S , SElemType e)
{
if(S.top - S.base == S.stacksize) return ERROR ;
*S.top = e ; // *S.top = e , S.top ++ ;*S.top ++ = e
S.top ++ ;
return OK ;
}
// 出栈
Status Pop(SqStack &S , SElemType &e)
{
if(S.base == S.top) return ERROR ;
e = *--S.top ; // -- S.top , e = S.top ;
return OK ;
}
// 遍历
Status StackTraverse(SqStack S)
{
int i ;
if(S.top == S.base) return ERROR ;
else
{
for(i = 0 ; i < S.top-S.base ; i ++)
cout << S.base[i] <<" " ;
}
return OK ;
}
// 清空
Status ClearStack(SqStack &S)
{
if(S.base) S.top = S.base ;
return OK ;
}
// 销毁
Status DestroyStack(SqStack &S)
{
if(S.base)
{
delete S.base ;
S.stacksize = 0 ;
S.base = S.top = NULL ;
}
return OK ;
}
三、com
// 不要用递归 !!
// 主函数里定义的变量,也是局部变量
#ifndef _FUNC_H
#define _FUNC_H
#define OK 0
#define ERROR -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status ;
typedef int SElemType ;
typedef struct
{
SElemType *base ;//base 就相当于 顺序表的elem
SElemType *top ;//top是栈顶的下一个位置
int stacksize ;
}SqStack ;
extern Status InitStack(SqStack &S) ; // 1、初始化
extern Status StackEmpty(SqStack S); // 判空
extern int StackLength(SqStack S);
extern Status GetTop(SqStack S , SElemType &e) ;
extern Status Push(SqStack &S , SElemType e);
extern Status Pop(SqStack &S , SElemType &e);
extern Status ClearStack(SqStack &S);
extern Status DestroyStack(SqStack &S);
extern Status StackTraverse(SqStack S) ;
#endif