数据结构——栈(顺序栈,链栈)的基本代码

数据结构——栈(顺序栈,链栈)

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);
  }

猜你喜欢

转载自blog.csdn.net/qq_37486501/article/details/80160855