| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2267 人关注过本帖
标题:如何从键盘输入表达式给字符数组赋值
只看楼主 加入收藏
混沌之灵
Rank: 2
等 级:论坛游民
帖 子:31
专家分:18
注 册:2008-12-19
收藏
 问题点数:0 回复次数:1 
如何从键盘输入表达式给字符数组赋值
如题!
一次输入整个表达式,以'.'结尾.

例如输入式子a+(b-c)*d.之后,
数组元素:a[0]=a ,a[1]=+ , ..., a[10]=.
然后输出:abc-d*+.
即将输入的中缀表达式输出为后缀表达式

自己写的程序如下:
(不能得到想要的结果,希望能帮忙修改一下)

程序代码:
#include "stdafx.h"

#include <process.h>
#include <malloc.h>
#include <math.h>


#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef int Status;

//栈的顺序存储表示
typedef char SElemType; // 定义栈元素类型为_____字符(用来处理表达式)

#define maxsize 100        //定义数组元素个数
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACK_INCREMENT 10 // 存储空间分配增量
typedef struct SqStack{
   SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
   SElemType *top; // 栈顶指针
   int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack; // 顺序栈


//顺序栈的有关基本操作
void InitStack(SqStack &S)
{ // 构造一个空栈S
   if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
     exit(OVERFLOW); // 存储分配失败
   S.top=S.base;
   S.stacksize=STACK_INIT_SIZE;
}

Status StackEmpty(SqStack S)
{ // 若栈S为空栈,则返回TRUE,否则返回FALSE
   if(S.top==S.base)
     return TRUE;
   else
     return FALSE;
}

void Push(SqStack &S,SElemType e)
{ // 插入元素e为新的栈顶元素
   if(S.top-S.base>=S.stacksize) // 栈满,追加存储空间
   {
     S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
     if(!S.base)
       exit(OVERFLOW); // 存储分配失败
     S.top=S.base+S.stacksize;
     S.stacksize+=STACK_INCREMENT;
   }
   *(S.top)++=e;
}

Status Pop(SqStack &S,SElemType &e)
{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
   if(S.top==S.base)
     return ERROR;
   e=*--S.top;
   return OK;
}

void trans(char *exp,char post[])
//逆波兰算法,将中缀算术表达式exp转换成后缀表达式postexp
{
    int i=0;
    SqStack op;
    InitStack(op); //建立运算符栈

    while(*exp!='\0')
    {
        switch(*exp)
        {
        case '(':   //判断为左括号
            Push(op,*exp);
            exp++;
            break;
        case ')':   //判断为右括号
            while(*op.top!='(')
            {  //将栈中'('前面的运算符退栈并存放到post中
                post[i++]=*op.top;
                op.top--;
            }
            op.top--;  //将'('退栈
            exp++;
            break;
        case '+':
            while(op.top!=op.base&&*op.top!='(')
            {  //将栈中运算符出栈
                post[i++]=*op.top;
                op.top--;
            }
            op.top++;      //栈空或栈顶为'('则进栈
            *op.top=*exp;
            exp++;
            break;
        case '*':
            while(*op.top=='-'||*op.top=='*')
            {  //将栈中运算符退栈并存放到post中
              post[i++]=*op.top;
              op.top--;
            }
            op.top++;    //将'*'进栈
            *op.top=*exp;
            exp++;
            break;
        case '-':
            while(*op.top!='-')
            {  //将运算符入栈
                op.top++;
                *op.top=*exp;
                exp++;
                break;
            }
            post[i++]=*op.top;
            op.top--;
            break;
        case '.':
            while(op.top!=op.base)
            {
                post[i++]=*op.top;
                op.top--;
            }
            post[i++]=*exp;
            break;
        default:
            post[i++]=*exp;
            exp++;
            break;
       
        }

    }

}



int main(int argc, char* argv[])
{
    int i=0;
    //char *p=null;
    char exp[maxsize]={NULL},post[maxsize]={NULL};
    printf("请输入检索表达式:\n");
    char *p=(char *)malloc(maxsize*sizeof(char));
    scanf("%s",exp);
    //for(i=0;i<maxsize;i++)
    //while(p)
    //    exp[i++]=*(p++);
    trans(exp,post);
    printf("逆波兰变换后表达式为:\n");
    for(i=0;i<maxsize;i++)
        printf("%c",post[i]);


    printf("Hello World!\n");
    return 0;
}




[ 本帖最后由 混沌之灵 于 2010-11-2 23:57 编辑 ]
搜索更多相关主题的帖子: 赋值 字符 键盘 表达 输入 
2010-11-02 23:53
混沌之灵
Rank: 2
等 级:论坛游民
帖 子:31
专家分:18
注 册:2008-12-19
收藏
得分:0 
来位大侠吧 ......
2010-11-03 22:27
快速回复:如何从键盘输入表达式给字符数组赋值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027099 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved