定义一个顺序栈,并完成实现以下操作(1)初始化(2)入栈(3)出栈(4)判断栈满(5)判断栈空(6)清空栈(7)显示栈中各元素(8)十进制到二进制的转换
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int QElemType;
typedef int SElemType;
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#include<iostream>
using namespace std;
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stackSize; //栈可用的最大容量
}SqStack;
Status InitStack( SqStack &S )
{
S.base =new SElemType[MAXSIZE];//分配空间
if( !S.base ) exit(OVERFLOW); //分配空间失败
S.top = S.base; //top初始为base,空栈
S.stackSize = MAXSIZE; //设置栈的容量
return OK;
}
bool StackFull( SqStack S )
{
if(S.top-S.base==S.stackSize) return true;
//栈空,返回真
else
return false;
}
bool StackEmpty( SqStack S )
{
if(S.top == S.base) return true;
//栈空,返回真
else return false;
}
int StackLength( SqStack S )
{
return S.top-S.base; //栈中元素的个数,即为顺序栈的长度
}
Status ClearStack( SqStack S )
{
if( S.base )
S.top = S.base;
//将top指向栈底,栈为空
return OK;
}
Status Push( SqStack &S, SElemType e)
{
if( S.top-S.base==S.stackSize ) // 栈满
return ERROR;
*S.top++=e;
// 元素e压入栈顶,栈顶指针加1
return OK;
}
Status Pop( SqStack &S, SElemType &e)
{
if( S.top == S.base ) // 栈空
return ERROR;
e= *--S.top; //栈顶指针减1,将栈顶元素赋给e
return OK;
}
Status GetTop( SqStack S, SElemType &e)
{
if( S.top == S.base )
return ERROR; // 栈空
e=*(S.top-1);
return e;
}
void DecimalToBinary(int N){
SqStack S;
InitStack(S);
while(N){
Push(S,N%2);
N=N/2;
}
while(!StackEmpty(S)){
Pop(S,N);
printf("%d",N);
}
printf("\n");
}
void StackPrint(SqStack &S){
int *p,*t;
p=S.top;
t=S.base;
printf("栈中元素:");
for(int i=0;i<StackLength(S);i++){
printf("%5d", *t);
t=t+1;
}
}
void main(){
int m,i,b,n,k,j=1;
SqStack S;
// printf("请输入一个十进制整数:");
// printf("该整数的二进制数是:\n");
// scanf("%d",&m);
// bajinzhi(m);
while(j)
{
printf("\n");
printf("\n\t\t 顺序栈实现整数表的基本操作 ");
printf("\n\t\t***************************************************** ");
printf("\n\t\t* 1------初始化 *");
printf("\n\t\t* 2------入栈 *");
printf("\n\t\t* 3------出栈 *");
printf("\n\t\t* 4------判断栈满 *");
printf("\n\t\t* 5------判断栈空 *");
printf("\n\t\t* 6------清空栈 *");
printf("\n\t\t* 7------显示栈中各元素 *");
printf("\n\t\t* 8------十进制到二进制的转换 *");
printf("\n\t\t* 0------返 回 *");
printf("\n\t\t******************************************************");
printf("\n\t\t 请选择菜单号(0--9): ");
scanf("%d",&m);
switch(m)
{
case 1:
if(InitStack(S))
printf("初始化成功!");
else
printf("初始化失败!");
break;
case 2:
printf("请输入要入栈几个整数:");
scanf("%d",&n);
for( k=0;k<n;k++){
printf("请输入要入栈的第%d个整数:",k+1);
scanf("%d",&i);
if(Push(S,i) )
printf("已入栈成功!\n");
else
printf("未入栈成功!\n");
}
break;
case 3:
if(Pop(S,i) )
printf("栈顶已出栈成功!");
else
printf("未出栈成功!");
break;
case 5:
if(StackEmpty(S))
printf("空栈!");
else
printf("不是空栈!");
break;
case 4:
if( StackFull(S) )
printf("栈满!");
else
printf("栈未满!");
break;
case 6:
ClearStack(S );
printf("栈已清空!");
break;
case 7:
if(S.base==S.top)
printf("栈中无元素!");
else
StackPrint(S);
break;
case 8:
printf("请输入一个十进制整数");
scanf("%d",&b);
printf("输出所对应的二进制整数是:");
DecimalToBinary(b);
break;
case 0:
j=0;
break;
default:
printf("\n\t\t 输入错误! 请重新输入! ");
}
}
}