数据结构与算法分析3.1 栈实现表达式+-*/运算

原创 2018年04月16日 23:23:29

用栈实现了表达式的运算,基本功能可以实现,enhance 给QA测试一下应该可以做个简单的计算器。

root@ubuntu:data-struct# cat stack_cal.c 
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef int element_t;
typedef struct {
int top;
int cap;
element_t * data;
} Stack_t, *Stack_ptr;
Stack_ptr new_stack(int cap)
{
Stack_ptr p1 = NULL;
        if (cap <= 2) return NULL;
p1 = malloc(sizeof(Stack_t));
if (p1) {
p1->top = -1;
p1->cap = cap;
p1->data = malloc(sizeof(element_t) * cap);
if (!p1->data) {
free(p1);
return NULL;
}
}
return p1;
}
void destroy_stack(Stack_ptr p)
{
if (p) {
free(p->data);
free(p);
}
}

//p must not be empty,

element_t stack_get_top(Stack_ptr p)
{
return p->data[p->top];
}
//p must not be empty 这个不是标准的栈操作

//只是为了能够让一个stack成为输入才(从0读取,而不是pop)用到这个函数。

element_t stack_get_pos(Stack_ptr p, int pos)
{
if (pos > -1 && pos <= p->top ) {
        return p->data[pos];
}
else {
printf("out of range!\n");
}
}      
element_t stack_pop(Stack_ptr p)
{
if (p && p->top >= 0) {
p->top--;
return p->data[p->top+1];
}
else {
printf("error pop an empty stack!\n");
return -1;
}
}
int stack_push(Stack_ptr p, element_t e)
{
if (p && (p->cap > p->top + 1)) {
p->data[++p->top] = e;
}
else {
printf("push erro:%s\n", !p ? "null stack input" : "not place to save");
return -1;
}
return 0;
}
int stack_is_empty(Stack_ptr p)
{
return p->top == -1 ? 1 : 0;
}
int stack_clean(Stack_ptr p)
{
if (p) {
p->top = -1;
}
return 0;
}
int stack_number(Stack_ptr p)
{
return p->top + 1;
}

int oper_map(char c) 
{
switch (c) {
case '/':
case '*':
return 5;
break;
case '+':
case '-':
return 6;
break;
case '(':
return 4;
break;
default :
return 0;
}
return 0;
}
int  cmp_oper(char c1, char c2) 
{
int d1 = oper_map(c1);
int d2 = oper_map(c2);
return d1 - d2;
}

int cal(int a1, int a2, char oper)
{
switch (oper) {
case '+' :
return a1 + a2;
break;
case '-':
return a1 - a2;
break;
case '*':
return a1 * a2;
break;
case '/':
return a1 / a2;
break;
default:
printf("Input error operator!!\n");
}
return -1;
}

//输入表达式,计算出值,如:4 + 5 * 1 *(8 - 6 / 2)- 3 = 26。暂不支持幂次方,和两位数(获取数不是本次考查重点)
int main()
{
Stack_ptr p1 =  new_stack(256);
Stack_ptr p2 =  new_stack(256);
char exp[] = "4+5*1*(8-6/2)-3", *str_p = NULL;
if (!p1 || !p2) {
printf("new stack error!!\n");
exit(-1);
}
//printf("Pls input your expression:");
int exp_len = strlen(exp), i;
str_p = exp;
//将中间表达式转换成后缀表达式:
for (i = 0; i < exp_len; i++) {
if (isdigit(exp[i])) {
stack_push(p2, atoi(&exp[i]));

else if (oper_map(exp[i])){// +- */ (
if (stack_is_empty(p1) || stack_get_top(p1) == '(') {
stack_push(p1, exp[i]);
}
else {
if ( cmp_oper(exp[i], stack_get_top(p1))  < 0) {
stack_push(p1, exp[i]);

else {
while (!stack_is_empty(p1) && 
cmp_oper(exp[i],stack_get_top(p1)) >= 0 ) {
stack_push(p2, stack_pop(p1));
}
stack_push(p1, exp[i]);
}
}
}
else if ( exp[i] == ')' ) {

while (!stack_is_empty(p1) && stack_get_top(p1) !='(' ) {

                             stack_push(p2, stack_pop(p1)); 

                        }

stack_pop(p1);//pop (
}
}
stack_push(p2, stack_pop(p1));
int a1, a2, tmp;
exp_len = stack_number(p2);
stack_clean(p1);
for (i = 0; i <= p2->top; i++) {
int tmp = stack_get_pos(p2, i);
if ( oper_map(tmp) ) {
a1 = stack_pop(p1);
a2 = stack_pop(p1);
stack_push(p1, cal(a2,  a1, tmp));
}
else {
stack_push(p1, tmp);
}
}
printf("Result:%d\n", stack_pop(p1));
}

root@ubuntu:data-struct# 

=====================运行结果====================

root@ubuntu:data-struct# ./a.out 
Result:26
root@ubuntu:data-struct# 

由http暗藏通道看网络安全

由http暗藏通道看网络安全 内容:什么是http暗藏通道什么是HttptunnelHttptunnel带来的安全问题一些解决思路总结参考资料关于作者宫一鸣 (yiming@securit...
  • sonicdater
  • sonicdater
  • 2002-03-13 08:58:00
  • 1091

数据结构之简单四则运算表达式求值8-(栈的实现)

利用栈实现简单的四则运算,有待提升的地方有,不支持负数的运算,只支持0-9之间数值的计算 代码如下 #include #include #include using namespace s...
  • wwq2015
  • wwq2015
  • 2015-09-15 17:34:45
  • 865

利用栈进行算术表达式运算的c++代码

  • 2011年07月10日 11:37
  • 29KB
  • 下载

数据结构课程设计---------用栈来实现表达式求值

1、需求分析 设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。 (1)输入的形式:表达式,例如2*(3+4)      包含的运算符只...
  • Hackbuteer1
  • Hackbuteer1
  • 2011-08-12 21:40:52
  • 48208

数据结构例程——表达式求值(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第5课时栈的应用1-表达式求值。例:用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,计算该表达式的运算结果。 解答:...
  • sxhelijian
  • sxhelijian
  • 2015-09-15 11:00:31
  • 7808

数据结构 栈的应用——算术表达式求值

实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数...
  • yao1373446012
  • yao1373446012
  • 2016-10-07 10:51:04
  • 9574

《数据结构与算法分析》—栈的链表和数组实现(C语言)

/*表头作为栈顶*/ #include #include struct Node { ElementType Element; PtrToNode Next; }; int IsE...
  • tengyuan93
  • tengyuan93
  • 2016-03-11 09:54:33
  • 458

栈的应用——Dijkstra双栈算法表达式求值算法

一、算法原理:
  • u014332174
  • u014332174
  • 2014-07-15 22:01:56
  • 1182

双栈实现算数表达式

双栈算术表达式求值算法 源代码是java实现的,先把他改成cpp实现。 原理大家应该都懂,就是两个栈,一个保存读取式子的符号,遇到“(”不读,遇到“)”进行操作,其他符号保存。另一个栈保存每次读到...
  • Juice_p
  • Juice_p
  • 2016-11-01 13:41:35
  • 528

表达式求值(顺序栈实现)

问题:算数运算的表达式求知 这道题不难,但是当你认真去编代码的时候,还是要考虑好多细节。 算法原理如下: 我们都知道算术四则运算的运算规则是: 先乘除,后加减。 从左到右计算 先算括号内,...
  • Rage_
  • Rage_
  • 2017-03-20 23:40:43
  • 647
收藏助手
不良信息举报
您举报文章:数据结构与算法分析3.1 栈实现表达式+-*/运算
举报原因:
原因补充:

(最多只允许输入30个字)