回 帖 发 新 帖 刷新版面

主题:数据结构--栈的应用

[b][size=4][color=FF00FF]我的blog,[url=http://www.ebainaoo.cn]http://www.ebainaoo.cn[/url]欢迎大家来踩[/color][/size][/b]

/*这一次写到栈了,继续加油....不知道还有没有什么地方可以改进
听别人说用主函数用void main()还是int main()好一些?有什么区别*/


#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "conio.h"
#define MAX 50
typedef struct node
{
    int data;
    struct node *next;
}Stacknode,*Linkstack;
Linkstack Init_Linkstack()
{
    return NULL;
}
Linkstack Push_Linkstack(Linkstack top,int x)
{
    Stacknode *s;
    s=new Stacknode;
    s->data=x;
    s->next=top;
    top=s;
    return top;
}
Linkstack Pop_Linkstack(Linkstack top,int *x)
{
    Stacknode *s;
    if(top==NULL)
        return NULL;
    else
    {
        *x=top->data;
        s=top;
        top=top->next;
        free(s);
        return top;
    }
}
void Print_Linkstack(Linkstack top)
{
    Stacknode *s;
    s=top;
    while(s->next!=NULL)
    {
        printf("%d->",s->data);
        s=s->next;
    }
    printf("%d",s->data);
}

typedef struct
{
    int data[MAX];
    int top;
}Seqstack;
Seqstack *Init_Seqstack()
{
    Seqstack *s;
    s=new Seqstack;
    s->top=-1;
    return s;
}
int Empty_Seqstack(Seqstack *s)
{
    if(s->top==-1)
        return 1;
    else
        return 0;
}
int Push_Seqstack(Seqstack *s,int x)
{
    if(s->top==MAX-1)
        return 0;
    else
    {
        s->top++;
        s->data[s->top]=x;
        return 1;
    }
}
int Pop_Seqstack(Seqstack *s,int *x)
{
    if(Empty_Seqstack(s))
        return 0;
    else
    {
        *x=s->data[s->top];
        s->top--;
        return 1;
    }
}
void coversion(int N,int r)
{
    int x;
    Seqstack *s;
    s=Init_Seqstack();
    printf("\n十进制%d转换为%d进制为:",N,r);
    while(N)
    {
        Push_Seqstack(s,N%r);
        N=N/r;
    }
    while(!Empty_Seqstack(s))
    {
        Pop_Seqstack(s,&x);
        printf("%d",x);
    }
}
void main()
{
    Linkstack top;
    int N,r;
    int k,x;
    top=Init_Linkstack();
    do{
        printf("\n\n\n");
        printf("\t\t\t       栈应用子系统     \n");
        printf("\t\t\t*************************\n");
        printf("\t\t\t**     1--链式进栈     **\n");
        printf("\t\t\t**     2--链式出栈     **\n");
        printf("\t\t\t**     3--链栈显示     **\n");
        printf("\t\t\t**     4--进制转换     **\n");
        printf("\t\t\t**     0--返    回     **\n");
        printf("\t\t\t*************************\n");
        printf("\t\t\t   请选择菜单(0-3):");
        scanf("%d",&k);
        switch(k)
        {
        case 1:
            printf("\n请输入进栈的元素x:");
            scanf("%d",&x);
            top=Push_Linkstack(top,x);
            printf("\n元素已进栈!按任意键返回..");
            getch();
            system("cls");
            break;
        case 2:
            top=Pop_Linkstack(top,&x);
            printf("\n头元素已出栈!按任意键返回..");
                                getch();
            system("cls");
            break;
        case 3:
            printf("\n链栈元素为:");
            Print_Linkstack(top);
            printf("\n按任意键返回..");
            getch();
            system("cls");
            break;
        case 4:
        printf("\n请输入十进制N和要转换的进制r(N,r):");
            scanf("%d,%d",&N,&r);
            coversion(N,r);
                                printf("\n按任意键返回..");
                                getch();
            system("cls");
            break;
        }
    }while(k!=0);
}






回复列表 (共9个回复)

沙发

是这样的
int main()是ansi c的标准格式
c从来就没有void main()这样的标准
这是vc带来的杜撰出来的不良编程习惯
一个良好的程序应该向操作系统汇报程序已经执行完毕并且有义务返回程序是否顺利地执行完毕

板凳

[quote]是这样的
int main()是ansi c的标准格式
c从来就没有void main()这样的标准
这是vc带来的杜撰出来的不良编程习惯
一个良好的程序应该向操作系统汇报程序已经执行完毕并且有义务返回程序是否顺利地执行完毕[/quote]
我也是这样认为的,我在GCC环境中调试时,main必须注为:
int main()
{
 return 0;
}

3 楼

说到栈,我给一个相关的程序代码:
列车调度问题?
铁路进行列车调度时, 常把站台设计成栈式结构的站台,试问:
        设有编号为1,2,3,4,5,6的六辆列车, 顺序开入栈式结构的站台, 则可能的出栈序列有多少种?
要求:(1)请给出程序代码.(最好是c版的)
       (2)如果能从概率方面分析,不用程序实现,请给出你的理论.

三种不同的解法:第一种是利用递推公式求解,第二种和第三种都是模拟出入栈的情景,采用回溯的方法求解,其中第二种只能求出组合的个数, 第三种可以输出具体的出栈序列。

程序一:
/*
  Name: 
  Copyright: 
  Author: 
  Date: 24-03-07 23:57
  Description: 公式: F(n) = F(0)*F(n-1) + F(1)*F(n-2) + F(2)*F(n-3) + ... + F(n-1)*F(0); 
*/
#include <stdio.h> 
#include <stdlib.h> 

int Stack(int n);

int main(void) 

    int n;
    puts("请输入列车的数量:");
    scanf("%d", &n);
    ; 
    printf("sum = %d\n", Stack(n));
  
      system("pause");
      return 0; 
}

int Stack(int n)
{
     if(n == 0 || n == 1) 
         return 1;
         
     int i = 0;
     int sum = 0;
     while (i < n)
     {
          sum += Stack(i) * Stack(n-i-1);
          i++;
    }
     return  sum;
}

程序二:
/*
  Name: 
  Copyright: 
  Author: 
  Date: 24-03-07 23:57
  Description: 
*/
#include <stdio.h> 
#include <stdlib.h> 
#define MAX 6

int count = 0;

void Stack(int t, int n);

int main(void) 

    int t = 0;
      
    Stack(t, 1); 
    
    printf("sum = %d\n", count);
  
      system("pause");
      return 0; 
}

void Stack(int t, int n)
{
    int i, j;
    if (n == MAX)
        ++count;//累积各种可能的出序 
    else
    {
        ++t;//入栈 
        for (i=0; i<=t; i++)//回溯 
            Stack(t-i, n+1);//出栈i个元素以后递归执行函数 
    }
}

程序三:
/*
  Name: 
  Copyright: 
  Author: 
  Date: 24-03-07 23:57
  Description: 
*/
#include <stdio.h> 
#include <stdlib.h> 
#define MAX 6

int count = 0;

void Stack(int s[], int cs[], int t, int ct, int n);

int main(void) 

    int s[MAX] = {0};//用来存储当前站内的列车序号 
    int cs[MAX] = {0};//用来存储已出站的列车序号 
    int t = 0;//s栈的栈顶指针 
    int ct = 0;//cs栈的栈顶指针 
    int n = 1;//入站的列车序号 
      
    Stack(s, cs, t, ct, n); 
    
    printf("\nsum = %d\n", count);
  
      system("pause");
      return 0; 
}

void Stack(int s[], int cs[], int t, int ct, int n)
{
    int i, j;
    int a[MAX];
    
    if (n == MAX)//如果所有的列车都已入站,输出其出站序列 
    {
        for (i=0; i<ct; ++i)//先输出已经出站的序列 
            printf("%d  ",cs[i]);
        printf("%d  ", n);//输出最后入站的列车,序号为n 
        for (i=t-1; i>=0; --i)//输出仍在站内的列车序列 
            printf("%d  ", s[i]);
        printf("\n");
        ++count;//累积各种可能的出序 
    }
    else
    {
        s[t++] = n;//入栈 
        for (i=0; i<=t; ++i)//把当前站内的列车序列复制到临时数组 
            a[i] = s[i];
        for (i=0; i<=t; ++i)//回溯 
        {
            for (j=0; j<i; ++j)//记录出站的列车序列 
                cs[ct+j] = a[t-j-1];
            
            Stack(s, cs, t-i, ct+j, n+1);//出栈i个元素以后递归执行函数 
        }
    }
}

4 楼

int main(){



return EXIT_SUCCESS;
}

5 楼

恩,挺不错的

6 楼

请问system("pause");什么意思,谢谢


7 楼


如上,也想知道答案!

8 楼


好久不来了

9 楼


  就是程序执行到一半回到编译状态,呵呵,我昨天正好向专家请教的同样的问题

我来回复

您尚未登录,请登录后再回复。点此登录或注册