设为首页 收藏本站
查看: 1698|回复: 0

[经验分享] Stack application

[复制链接]

尚未签到

发表于 2015-9-15 09:59:21 | 显示全部楼层 |阅读模式
  上篇博文里用数组实现stack,然后做了个简单的小括号匹配应用。这次我用stack去实现表达式的infix to postix的转换。如2+3+4*5变为2 3+ 4 5* +.来实现表达式的stack方式求值。只应对了简单的加减乘除,而且输入是连续的,当然后面我可以改进。不过看起来时间不够,先把架子搞出来。
  收获:
  1. 变量声明要放在主函数内的前面。因为我用的是visual C++6.0 ,而且用的是C语言,根据K&R标准,是要放在前面的,不过ANSI C等可以随时用随时定义。
  2. 还是那句话,眼过千遍不如手过一遍(CU的一个大佬说的^^).光说不练还是不会,一写代码各种syntax error,太丢人。
  3. 实现过程中主要注意两点,一是操作符的优先级,而是操作符的结合顺序。
  待整理:
  1. 包含括号的情形。小括号具有最高的优先级,碰到比括号是将最近匹配的括号内全部输出。
  2. 输入有空白的情形。



//stack appliation ---expression convertion from infix to postfix
#include <stdio.h>
#include <stdlib.h> //include exit(),malloc() function。
#include <string.h> //include strlen function
#include <ctype.h>
#define EMTPTYSTACK -1 //define the empty stack arry subcript, so the element would be started from array[0]
#define MAXELEMENTS 100
struct StackRecord;
typedef struct StackRecord *Stack;
typedef char ElementType ; //define element type
void Error (char input[])
{
printf("%s\n",input);
exit(4);
}
struct StackRecord
{
int Capacity; // record the total space allocated for this stack
int TopOfStack; //record the Array subscript of top element
ElementType *Array; //record the allocated array address
};
int IsEmpty(Stack S);
int IsFull(Stack S);
void Push(ElementType x, Stack S);
void Pop(Stack S);
Stack CreateStack(int Maxelement);
void MakeEmpty (Stack S);
ElementType Top(Stack S);
ElementType PopAndTop(Stack S);

int IsEmpty (Stack S)
{
return S->TopOfStack == EMTPTYSTACK;
}
int IsFull (Stack S)
{
return S->TopOfStack == S->Capacity-1; //topofstack is ranged from 0 to MAXELEMENTS-1
}
void Push(ElementType x, Stack S)
{
if(IsFull(S))
Error("Out of Space !!!\n");
else
S->Array[ ++S->TopOfStack ] = x;
}
void Pop (Stack S)
{
if ( IsEmpty( S) )
Error("Empty Stack !!\n");
else
S->TopOfStack--;
}
Stack CreateStack (int Maxelement)
{
Stack S;
S = malloc(sizeof(struct StackRecord));
if (S == NULL)
Error("Out of Space !!!\n");
S->Array=malloc(sizeof(ElementType)*Maxelement);
if (S->Array == NULL)
Error("Out of Space !!!\n");
S->Capacity = Maxelement;
MakeEmpty (S);
return S;
}
void MakeEmpty (Stack S)
{
S->TopOfStack = EMTPTYSTACK;
}
ElementType Top(Stack S)
{
return S->Array[S->TopOfStack];
}
ElementType PopAndTop(Stack S)
{
return S->Array[S->TopOfStack--]; //operator precedence of -> (left to right) is higher than --/++ ;
}
int Getprecedence(char x)
{
if (x == '+' || x == '-')
return 1;
if (x == '*' || x == '/' )
return 2;
if (x == '(' || x == ')')
return 3;
return -1;   
}
int ZeroIfNegative (int x)
{
if (x<0)
return 0;
else
return x;
}
int main (void)
{
char ch;
int stack_precedence;
int input_precedence;
Stack stack_instance;
stack_instance=CreateStack(MAXELEMENTS);
while( (ch=getchar()) != EOF && ch != 'q')
{
if( isdigit(ch) )
putchar(ch);
else
{
if ( IsEmpty(stack_instance) ) //push operator for empty stacks
Push(ch,stack_instance);
else
//{
//if ( Getprecedence (Top(stack_instance)) < Getprecedence(ch) )
//Push(ch, stack_instance);
//else
{ while( (Getprecedence (Top(stack_instance)) >= Getprecedence(ch) ) && (!IsEmpty(stack_instance)) )
//because addition/subtraction/multiplication/division are all associated from left to right,so it is >=,
//otherwise it will be > only.
{printf("%c",Top(stack_instance) );
Pop(stack_instance);
}
Push(ch,stack_instance);
}
putchar(' ') ;//to split the digits
}
}
while(! IsEmpty(stack_instance) )
{putchar(Top(stack_instance) );
Pop(stack_instance);
}
return 0;
}

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-113823-1-1.html 上篇帖子: CentOS 6.x 下Postfix和dovecot邮件服务安装和基本配置 下篇帖子: postfix邮件服务器搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表