包括三个文件:stack.h,stack.cpp,main.cpp
stack.h
#include "stdio.h"
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define Status int
#define SElemType int
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW 0
#define ERROR 0
#define OK 1
//
typedef struct
{
SElemType *base; //指向栈尾
SElemType *top; //指向栈顶
int stacksize; //记录栈元素个数
}SqStack;
//
//
//栈的基本操作
//
//初始化栈
Status InitStack(SqStack &S);
//返回1,表示成功;返回0表示不成功
//判栈满
Status IsFull(SqStack &S);
//判栈空
Status IsEmpty(SqStack &S);
//如空,返回1;非空返回0
//入栈
Status Push(SqStack &S,SElemType e);
//出栈
Status Pop(SqStack &S,SElemType &e);
//显示栈元素
Status StackTraverse(SqStack &S);
//访问栈顶
Status GetTop(SqStack &S,SElemType &e);
//求栈长度
int StackLength(SqStack &S);
//清空栈
Status ClearStack(SqStack &S);
//销毁栈
Status DestroyStack(SqStack &S);
stack.cpp
#include "stack.h"
#include "stdio.h"
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
using namespace std;
//栈的基本操作
//
////初始化栈
Status InitStack(SqStack &S)
{ //构造一个空栈
S.base =(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) return(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
//判栈满
Status IsFull(SqStack &S)
{ //若满返回1,否则返回0
if((S.top-S.base)>= S.stacksize) //若栈满
{ //cout<<"栈满"<<endl;
return 1;}
else return 0;
}
//判空
Status IsEmpty(SqStack &S)
{ //若栈空返回1,否则返回0
if(S.top==S.base)
{ //cout<<"栈空"<<endl;
return 1;
}
else return 0;
}
//入栈
Status Push(SqStack &S,SElemType e)
{ //将e插入栈顶
//判满,加空间
if( IsFull(S)==1)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType));
if(S.base==NULL) return(OVERFLOW);
S.top=S.base + S.stacksize; //top指针移动到新位置
S.stacksize=S.stacksize + STACKINCREMENT; //栈空间扩容
}
*S.top=e; //栈顶元素赋值
S.top++; //top指针上移
//入栈
return 0;
}
//出栈
Status Pop(SqStack &S,SElemType &e)
{ //弹出栈顶元素,并用e接收
//判空
if(IsEmpty(S)==1) return(ERROR);
//弹出
S.top--;
e=*S.top; //等价于e= *(--top)
return OK;
}
//显示栈中元素
Status StackTraverse(SqStack &S)
{ //
cout<<"遍历栈元素"<<endl;
SElemType *p;
p=S.base;
while(p!=S.top)
{
cout<<*p<<" ";
p++;
}
cout<<endl;
cout<<"遍历完毕!"<<endl;
return 0;
}
//取栈顶元素
Status GetTop(SqStack &S,SElemType &e)
{ //若栈空返回ERROR,否则返回1
if(IsEmpty(S)==1) return ERROR;
S.top--;
e=*S.top;
return OK;
}
//求长度
int StackLength(SqStack &S)
{
return S.top-S.base;
}
//清空栈
Status ClearStack(SqStack &S)
{
S.top=S.base;
//cout<<"已清空栈"<<endl;
return OK;
}
//销毁栈
Status DestroyStack(SqStack &S)
{
free(S.base);
S.top=NULL;
S.base=NULL;
S.stacksize=0;
cout<<"已销毁栈"<<endl;
return OK;
}
main.cpp
#include <iostream>
#include "stack.h"
using namespace std;
int main()
{
/*
SqStack sta;
InitStack(sta);
cout<<IsEmpty(sta)<<endl;
Push(sta,'a');
Push(sta,'b');
Push(sta,'c');
Push(sta,'d');
cout<<"栈长度为:"<<StackLength(sta)<<endl;
StackTraverse(sta);
cout<<IsEmpty(sta)<<endl;
SElemType e;
Pop(sta,e);
cout<<"栈长度为:"<<StackLength(sta)<<endl;
cout<<"e="<<e<<endl;
StackTraverse(sta);
GetTop(sta,e);
cout<<"e="<<e<<endl;
cout<<"栈长度为:"<<StackLength(sta)<<endl;
ClearStack(sta);
cout<<"栈长度为:"<<StackLength(sta)<<endl;
Push(sta,'a');
Push(sta,'b');
Push(sta,'c');
Push(sta,'d');
StackTraverse(sta);
cout<<"栈长度为:"<<StackLength(sta)<<endl;
DestroyStack(sta);
//cout<<"栈长度为:"<<StackLength(sta)<<endl;
*/
/*
//需求:将一个十进制转换为二进制
void conversion();
conversion();
//cout<<"栈长度为:"<<StackLength(sta)<<endl;
*/
//需求:行编程程序
/*
void LineEdit();
LineEdit();
*/
//需求:后缀表达式求值 3 4 + 5 * 7 /
char str[100];
fgets(str,100,stdin); //从标准 输入获取字符串
int res=0;
int ReverseCal(char *); //函数声明
res=ReverseCal(str); //函数调用
cout<<"res="<<res<<endl;
system("pause");
return (0);
}
int Precede(char* c1,char* c2)
{ //大于返回1,小于返回-1,等于返回0
if(*c1=='*')
{
if(*c2=='+') return 1;
if(*c2=='-') return 1;
if(*c2=='*') return 0;
if(*c2=='/') return 0;
}
if(*c1=='/')
{
if(*c2=='+') return 1;
if(*c2=='-') return 1;
if(*c2=='*') return 0;
if(*c2=='/') return 0;
}
if(*c1=='+')
{
if(*c2=='+') return 0;
if(*c2=='-') return 0;
if(*c2=='*') return -1;
if(*c2=='/') return -1;
}
if(*c1=='-')
{
if(*c2=='+') return 0;
if(*c2=='-') return 0;
if(*c2=='*') return -1;
if(*c2=='/') return -1;
}
}
char* InffixToSuffix(char *s)
{ //将中缀表达式转换为后缀表达式
SqStack OPTR; //操作符栈
SqStack OPND; //操作数栈
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#');
char *p=s;
while(*p!='\0')
{
switch(*p)
{
//如果不是运算符(是数字),入栈
//如果是运算符,比较符合栈的操作符,再做
}
p++;
}
return s;
}
int ReverseCal(char *s)
{ //逆波兰式计算器
SqStack sta;
InitStack(sta); //初始化话一个栈结构
int res;
int a,b;
char *p=s;
p=strtok(s," "); //分解字符串
Push(sta,atoi(p)); //atoi()函数将字符串转换为int
while( (p=strtok(NULL," ")) !='\0')
{
switch(*p)
{
case '+':
Pop(sta,b);
Pop(sta,a);
res = a+b;
Push(sta,res); //将结果入栈
break;
case '-':
Pop(sta,b);
Pop(sta,a);
res = a-b;
Push(sta,res);
break;
case '*':
Pop(sta,b);
Pop(sta,a);
res = a*b;
Push(sta,res);
break;
case '/':
Pop(sta,b);
Pop(sta,a);
res = a/b;
Push(sta,res);
break;
default: Push(sta,atoi(p)); //如果获取数字直接入栈
}
}
return res;
}
/*
void LineEdit()
{ //行编辑函数
cout<<"请输入字符:"<<endl;
SqStack sta;
InitStack(sta); //初始化话一个栈结构
char ch,e;
ch=getchar();
//cout<<ch;
while(ch!=EOF && ch!='\n')
{
switch(ch)
{
case '#': Pop(sta,e); //若输入#,回退一格
break;
case '@': ClearStack(sta); //若输入@,回退一行
break;
default: Push(sta,ch);
break;
}
ch=getchar();
}
StackTraverse(sta); //遍历栈元素
DestroyStack(sta); //销毁栈
}//行编辑函数
*/
void conversion()
{ //进制转换程序
int N;
cout<<"请输入一个正整数:"<<endl;
cin>>N;
SqStack sta;
InitStack(sta);
while(N!=0)
{
Push(sta,N%2); //求余
N=N/2; //整除
}
//StackTraverse(sta);
cout<<"对应的二进制为:"<<endl;
while(IsEmpty(sta)!=1)
{
SElemType e;
Pop(sta,e);
cout<<e<<" ";
}
cout<<endl;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。