数据结构——栈(顺序栈,链栈)
1.采用顺序存储实现栈的初始化、判栈为空、入栈、求栈顶元素、出栈实现、将任意一个十进制整数转化为R进制整数操作。
2.采用链式存储实现栈的初始化、判栈为空、入栈、求栈顶元素、出栈操作。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MAX 100 //栈的最大值
typedef struct {
//顺序栈
int data[MAX];
int top;
}SqStack;
void StackInit(SqStack &M)//栈的初始化
{
M.top=-1;
}
void StackEmpty(SqStack M)//判栈为空
{
if(M.top==-1)
{
printf("栈为空\n");
}
else printf("栈不为空\n");
}
void Push(SqStack &M,int m)//入栈
{
if(M.top==MAX-1)
{
printf("栈已满,不可Push\n");
}
else {
M.top++;
M.data[M.top]=m;
printf("栈中元素%d 已入栈\n",m);
}
}
void StackGetTop(SqStack &M,int &m)//取栈顶元素
{
if(M.top==-1)
{
printf("栈中无栈顶元素,即栈中无元素\n");
}
else{
m=M.data[M.top];
printf("栈顶元素为%d\n",m);
}
}
void Pop(SqStack &M)//出栈
{ int m;
if(M.top==-1)
{
printf("栈为空,不可Pop\n");
}
else {
m=M.data[M.top];
M.top--;
printf("栈中元素%d 已出栈\n",m);
}
}
void TenchangeR(int &m,int &n)//将任意一个十进制整数转化为R进制整数操作
{
SqStack O;
StackInit(O);
int a;
while (m!=0) {
a=m%n;
O.top++;
O.data[O.top]=a;
m=m/n;
}
while (O.top!=-1) {
int m;
m=O.data[O.top];
O.top--;
printf("%d",m);
}
printf("\n\n");
}
typedef struct StackNode{
//链栈
int data;
struct StackNode *next ;
}*LinkStack;
void LinkStackInit(LinkStack &Top){//链栈的初始化
Top=NULL;
}
void LinkStackEmpty(LinkStack &Top){//判栈为空
if(Top==NULL)
{
printf("栈为空\n");
}
else printf("栈不为空\n");
}
void LinkPush(LinkStack &Top,int m){//入栈
LinkStack p=(LinkStack)malloc(sizeof(StackNode));
//头插法
p->data=m;
p->next=Top;
Top=p;
printf("栈中元素%d 已入栈\n",m);
}
void LinkTop(LinkStack &Top)//取栈顶元素
{
if(Top==NULL)
{ printf("栈中无栈顶元素,即栈中无元素\n");}
else printf("栈顶元素为%d\n",Top->data);
}
void LinkPop(LinkStack &Top,int m){//出栈
LinkStack p=(LinkStack)malloc(sizeof(StackNode));
if(Top!=NULL)
{
m=Top->data;
p=Top;
Top=Top->next;
free(p);
printf("栈中元素%d 已出栈\n",m);
}
}
int main()
{
//顺序栈
printf("下面是顺序栈\n\n");
SqStack Q;
StackInit(Q);
StackEmpty(Q);
Push(Q,3);
Push(Q,4);
Push(Q,4);
int x;
int m,n;
StackEmpty(Q);
Pop(Q); //可在此使用x
//printf("%d",x);
Pop(Q);
//printf("%d",x);
StackGetTop(Q,x);//只取栈顶元素,不出栈
Pop(Q);
printf("请输入一个十进制数和一个R进制数,我们将把它转化为R进制\n");
scanf("%d%d",&m,&n);
TenchangeR(m,n);//将任意一个十进制整数转化为R进制整数操作
//链栈
printf("下面是链栈\n\n");
LinkStack P;
LinkStackInit(P);
LinkStackEmpty(P);
LinkPush(P,3);
LinkPush(P,4);
LinkPush(P,5);
LinkPop(P,5);
LinkPop(P,4);
LinkTop(P);
LinkPop(P,3);
LinkTop(P);
printf("\n\n");
//栈实现表达式求值算法
printf("下面是栈实现表达式求值算法: (56-20)/(7-1)+8\n\n");
char exp[30]="(56-20)/(7-1)+8";;
char postexp[30];
float f=0.0;
//求exp的逆波兰式,得到postexp
trans(exp,postexp);
//对postexp求值
f=compvalue(postexp);
printf("%s = %.2f\n",exp,f);
}